具体化视图和存储函数
现在你已了解基本 KQL 查询和优化技术,接下来让我们探索 Eventhouse 中的具体化视图和存储函数。
了解具体化视图
具体化视图是预计算聚合,可解决 KQL 数据库中的常见性能挑战。 Eventhouse 中的 KQL 数据库通常包含来自流式处理数据源(如 IoT 传感器、应用程序日志和其他事件)的数百万或数十亿行信息。 跨这些大型数据集运行聚合查询可能需要花费大量时间和计算资源。
具体化视图会存储预计算聚合结果,并在新数据到达时自动更新这些结果。 无需在每次查询时都从所有历史数据中重新计算指标,具体化视图会维护结果,且仅处理新数据来更新聚合。 这为仪表板和报告提供即时结果,即使在处理大型数据集时也是如此。
自动更新的工作原理
具体化视图由两个部分组成,它们共同提供始终最新的结果:
- 具体化部分:从已处理的数据预计算的聚合结果
- 增量:自上次后台更新以来已到达的新数据
查询具体化视图时,系统会在查询时自动合并这两个部分,以提供全新的、最新的结果。 这意味着具体化视图始终返回当前数据,而不考虑上次运行后台具体化过程的时间。 同时,后台进程会定期将数据从增量部分移到具体化部分,使预计算结果保持最新状态。 此方法提供预计算结果的速度和实时数据的新鲜度。
创建具体化视图
具体化视图封装 KQL summarize 语句,该语句会在新数据到达时自动更新。 下面是按供应商和日期跟踪行程指标的示例:
.create materialized-view TripsByVendor on table TaxiTrips
{
TaxiTrips
| summarize trips = count(), avg_fare = avg(fare_amount), total_revenue = sum(fare_amount)
by vendor_id, pickup_date = format_datetime(pickup_datetime, "yyyy-MM-dd")
}
查询具体化视图
创建后,可以像常规表一样查询具体化视图:
TripsByVendor
| where pickup_date >= ago(7d)
| project pickup_date, vendor_id, trips, avg_fare, total_revenue
| sort by pickup_date desc, total_revenue desc
了解存储函数
KQL 包括将查询封装为函数的功能,简化了常见查询的重复使用。 还可以为函数指定参数,以便可以使用变量值重复相同的查询。
在 Eventhouse 中,当存在流式处理数据且有多个编写查询时,存储函数非常有用。 无需重复编写相同的筛选或转换逻辑,你可以将它定义为一个函数,然后在不同的查询中重复使用它。 函数还有助于确保在不同的团队成员需要向数据应用相同的逻辑时一致地执行计算。
创建函数
.create-or-alter function trips_by_min_passenger_count(num_passengers:long)
{
TaxiTrips
| where passenger_count >= num_passengers
| project trip_id, pickup_datetime
}
若要调用函数,请像表格一样使用它。 在此示例中,trips_by_min_passenger_count 函数用于查找至少有三名乘客的 10 次行程:
trips_by_min_passenger_count(3)
| take 10