日志分析查询优化
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.
我 运行 这个关于日志分析的查询
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.