azure-data-explorer - 表查询慢 | 哪里 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% 的重复条目。
据我们了解,查询应该这样执行:
- 为源表准备过滤器,从特定日期时间范围开始
- 顺序描述:向后走
- 走下桌子,当你有 20 行不同的行时停下来
从它有时看起来几乎好像 ADX 遍历整个表,执行不同的,然后只占用最上面的 20 行。
如果我们交换,问题仍然存在 | 订购和| 周围明显。如果我们移动,问题就会消失 | 与查询末尾不同,但我们经常收到比要求少的 1-2 个项目。
我们是否犯了逻辑错误,可以重写此查询,还是手头有更好的选择?
解决方案
推荐阅读
- user-interface - 将 javafx 应用程序的背景从明亮(默认)更改为黑暗
- amazon-web-services - 使用 AWS rekognition 识别图像中的人
- tensorboard - 使用现有的 Tensorboard URL 而不是创建新的实验
- reactjs - 我必须在选择中选择两个值两次,以便它识别我选择的第一个值 - reactjs
- c# - 如果新请求在当前时间跨度之间,则 Rx 缓冲区重置
- python - 如何遍历字符串中的每个字符并将其与字符串中的位置相乘?
- python - 无法在 chrome 操作系统上安装 kivy
- django - 如何在 drf 中使用 uuid 检索数据
- python - 如何格式化停止进程的异常?
- json - 如何在python中合并两个具有相同键但不同值的字典