有效使用 KQL

已完成

了解如何编写高效的 KQL 查询对于在使用 Eventhouses 时获得良好性能至关重要。 本单元介绍关键优化技术,并说明它们对查询很重要的原因。

为什么查询优化很重要

KQL 数据库中的查询性能取决于处理的数据量。 了解 KQL 如何处理数据时,可以编写以下查询:

  • 通过减少扫描的数据来更快地运行 - 例如,无需扫描数百万行,而是提前筛选以仅处理数千行
  • 使用较少的资源 - 例如,仅选择 3 列而不是所有 50 列可减少处理开销
  • 可靠地处理不断增长的数据 - 例如,在数据增长到 1000 万行时,目前适用于 1000 万行的查询仍将表现良好

关键原则是:查询需要处理的数据越少,运行速度就越快。

了解关键优化技术

提前有效地筛选数据

筛选减少了后续作需要处理的数据量,KQL 数据库使用索引和数据组织技术,使早期筛选特别高效。

基于时间的筛选 有效,因为 Eventhouses 通常包含时序数据:

TaxiTrips
| where pickup_datetime > ago(30min)  // Filter first - uses time index
| project trip_id, vendor_id, pickup_datetime, fare_amount
| summarize avg_fare = avg(fare_amount) by vendor_id

按筛选器消除的数据量对筛选器进行排序 - 首先放置消除最多数据的筛选器。 将其视为漏斗图:从删除最多行的筛选器开始,然后将更具体的筛选器应用于剩余数据:

TaxiTrips
| where pickup_datetime > ago(1d)    // Time filter first - eliminates most data
| where vendor_id == "VTS"           // Specific vendor - eliminates some data  
| where fare_amount > 0              // Value filter - eliminates least data
| summarize trip_count = count()

提前减少列

投影 或仅选择所需的列可减少资源使用量。 使用包含许多列的宽表时,这一点尤其重要。

TaxiTrips
| project trip_id, pickup_datetime, fare_amount  // Select columns early
| where pickup_datetime > ago(1d)                // Then filter
| summarize avg_fare = avg(fare_amount)

优化聚合和联接

聚合和联接是资源密集型作,因为它们需要处理和合并大量数据。 构建它们的方式可能会显著影响查询性能。

对于聚合,在浏览数据时限制结果

TaxiTrips
| where pickup_datetime > ago(1d)
| summarize trip_count = count() by trip_id, vendor_id
| limit 1000  // Limit results for exploration

对于联接,请先放置较小的表。 联接表时,KQL 处理第一个表以与第二个表匹配。 从较小的表开始意味着要处理的行更少,使联接更高效。

// Good: Small vendor table first
VendorInfo        
| join kind=inner TaxiTrips on vendor_id

// Avoid: Large taxi table first
TaxiTrips         
| join kind=inner VendorInfo on vendor_id