大型 Table 上的慢查询性能

Slow Query Performance on Large Table

我有一个包含 5600 万行的 table。

此 table 在从 KAFKA 加载流数据时每 5 分钟处理一次 UPSERTS 的高负载。每次加载约 200-500k 次更新。

当我 运行 一个 SELECT 对时间戳列之一使用 ORDER BY 时,需要 5-7 分钟才能 return 结果。

我为该列尝试了集群键,但由于该列上有高 DML 操作 table 并且该列本身具有高基数,因此集群效率低且成本高。

到目前为止,将查询时间显着减少到大约 15 秒的唯一想法是将仓库大小从小增加到超大。

我不认为唯一的解决办法是增加仓库规模。这里有任何建议都很棒!

date(timestamp)(或基数较低的东西)上进行集群会更有效,尽管由于更新量的原因它仍然会很昂贵。

在欢乐时光活动中,我听说一位 Snowflake 用户通过对迟到的事实(例如 iff(event_date<current_date, true, false)))进行聚类,在类似(ish)场景中取得了 acceptable 结果(尽管我认为他们 INSERTing 而不是 UPSERTing 并且在后一种情况下,无论如何都必须重写微分区,所以它可能没有多大帮助。)

还有其他事情需要考虑。

检查查询计划以确认排序是问题所在(例如,在排序上花费了大量时间。)在没有看到您的实际查询的情况下,我想知道是否大部分时间都花在了 table 扫描(当它从远程存储中获取数据时。)如果一个更大的仓库提高了性能,这很可能是这种情况,因为集群中每个添加的节点都意味着可以同时读取更多的微分区。

你运行反对:

  1. 真正的时间戳列?
  2. 一个 JSON 列转换为时间戳但没有 附加功能?
  3. JSON
  4. 中有多少字段
  5. UPDATE 与 INSERT 的相对比率是多少?
  6. 你看过集群统计数据了吗?