首页 > 解决方案 > 表查询慢 | 哪里 x | 按时间戳排序 | 不同的 a,b,c,d | 桌子大时取 20

问题描述

我们的查询结构如下:

table(tablename)
| where MeasurementName in ('ActiveJobId')
    and MachineId == machineId
    and SourceTimestamp <= from
    and isnotnull( Value)
| order by SourceTimestamp desc
| distinct SourceTimestamp, MeasurementName, tostring(Value), SourceTimestampUtc
| take rows

tablename, machineId, from, rows都是查询参数。行通常是“20”。值列的类型为“动态”

该表包含 2.4 亿个条目,其中约 64,000 个符合 WHERE 标准。查询的目标是获取给定机器和数据点的最后 20 个唯一的非空条目,从特定日期开始。

查询在 Staging 数据库系统中运行顺利,但在 Dev 系统上开始降低性能。可能是因为数据量增加。

如果我们删除 distinct 子句,或者将它移到 TAKE 子句后面,查询会很快完成。(<1 秒)。数据包含大约 5-10% 的重复条目。

据我们了解,查询应该这样执行:

  1. 为源表准备过滤器,从特定日期时间范围开始
  2. 顺序描述:向后走
  3. 走下桌子,当你有 20 行不同的行时停下来

从它有时看起来几乎好像 ADX 遍历整个表,执行不同的,然后只占用最上面的 20 行。

如果我们交换,问题仍然存在 | 订购和| 周围明显。如果我们移动,问题就会消失 | 与查询末尾不同,但我们经常收到比要求少的 1-2 个项目。

我们是否犯了逻辑错误,可以重写此查询,还是手头有更好的选择?

标签: azure-data-explorer

解决方案


查询的目标是获取给定机器和数据点的最后20 个唯一的非空条目,从特定日期开始。

部分描述与您的查询中的过滤器不匹配:and SourceTimestamp <= from-您的意思是使用>=而不是<=

我们是否犯了逻辑错误,可以重写此查询,还是手头有更好的选择?

如果上游不能消除重复,可以考虑设置一个物化视图执行去重,然后直接查询视图而不是原始数据。另请参阅处理重复数据


推荐阅读