日志分析查询优化

Log analytics query optimization

我 运行 这个关于日志分析的查询

                                        Perf
                                        | where TimeGenerated >= ago(5m) 
                                        | join kind = inner
                                            ( 
                                                Heartbeat  
                                                | where TimeGenerated >= ago(5m)
                                                | summarize arg_max(TimeGenerated, *) 

                                                by SourceComputerId
                                            ) on Computer
                                        | summarize arg_max(TimeGenerated, *) by SourceComputerId, CounterName
                                        | extend  Indicator = strcat(ObjectName,'-', CounterName)
                                        | summarize dict = make_dictionary
                                        (   
                                            pack
                                            (      
                                                  'WorkspaceId' 
                                                ,  TenantId
                                                ,  Indicator       
                                                ,  CounterValue
                                                ,  'TimeGenerated'   
                                                ,  TimeGenerated
                                                ,  'Computer'
                                                ,  Computer
                                            )
                                        )  by SourceComputerId
                                        | evaluate bag_unpack(dict)

但是有点慢。有什么方法可以优化它,我希望尽可能快的查询来获得相同的结果。

如果不提及每个 join 支路的数据大小(例如记录数)和 SourceComputerId 列的基数,很难说出来。

我建议您阅读涵盖多种优化技术的 query best practices 文档,看看是否有帮助

更新:明确提及可能对您的情况有帮助的最佳做法:(供您验证)

  • 使用连接运算符时 - 选择行数较少的 table 作为第一个(最左边)。
  • 当左侧较小(最多 100,000 条记录)而右侧较大时,建议使用 hint.strategy=broadcast。
  • 当join的两边都太大,并且join key的基数很大时,建议使用hint.strategy=shuffle。
  • 当summarize operator的group by keys为高基数(最佳实践:100万以上)时,建议使用hint.strategy=shuffle.