我在SnowFlake有一张桌子。当我对它执行SELECT查询时,结果集包含一系列行。我需要一次处理10000行。因此,我通过偏移(使用SELECT *和LIMIT 10000 OFFSET desired_offset)使用批处理机制。
我使用SnowFlake的缓存机制来重用计算结果。因此,我只运行第一个查询(返回行的gigs )一次,然后使用不同的offset值重用这个结果。
但是,当偏移量不断增大时,查询执行时间就会变大。一些初始基准测试表明,查询执行时间与偏移量成正比的是。因为偏移量达到了值的大小,所以每次查询所需的时间为分钟,随后为小时。这是一个很长的过程。
我想知道是否有一种方法可以优化这个过程。请注意,我不允许在结果集的顶部创建视图,也不允许将结果集存储为另一个表(也就是说,我只想在db上拥有读取权限)。
下面应该提供我正在运行的查询的要点:
获取结果集的第一个查询:
SELECT *
FROM my_table
WHERE some_condition;随后的查询:
SELECT *
FROM table(result_scan('query_id_of_first_query'))
LIMIT 10000 OFFSET desired_offset;以下是执行时间wrt偏移值的基准:
10^5 | 982ms
10^6 | 1.79s
10^7 | 12.59
10^8 | 1m 57s
10^9 | 19m 41s
3*10^9 | 1h 4m 55s 若要添加更多细节,请参见:
上面的基准测试是针对小型仓库的。我还尝试使用大型仓库,正如预期的那样,它将运行时间减少到25%。
但是,我需要更多的“软件”方法,而不是“硬件”方法:)。
发布于 2020-06-03 11:42:57
这是一个很好的问题,您能扩展一下“我不允许将结果集存储为另一个表”吗?这包括创建一个临时表,这实际上就是雪花在某种程度上所做的。
您在多大的虚拟仓库上运行此操作,并在query1中对结果进行排序?
也许在SELECT中添加伪列、按其排序,并在偏移量查询中使用它,将有助于限制偏移量查询中处理的数据量。我这么说是因为最终的目标是限制您在每个查询中扫描的微分区的数量,所以作为第一步,我希望这样做。如果您可以使用集群键创建临时表,并在“偏移”逻辑中使用这些列,那么您也应该做得很好。
我希望这个helps...Rich
https://stackoverflow.com/questions/62169821
复制相似问题