如何在snowflake中加快偏移计算时间?

jv4diomz  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(434)

我有一张铺着雪花的table。当我表演 SELECT 查询时,结果集包含多行。我需要一次处理10000行。因此,我通过偏移量使用批处理机制(我做 SELECT *LIMIT 10000 OFFSET desired_offset ).
我使用snowflake的缓存机制来重用计算结果。因此,我运行第一个查询(返回gigs行)一次,然后用不同的值重用这个结果 offset .
但是,随着偏移量不断增大,查询执行时间也会变长。一些初始基准测试表明,查询执行时间与偏移量成正比。因为偏移量达到了gig的值,所以每个查询所用的时间都是几分钟,然后是几小时。这是一个非常漫长的过程。
我想知道是否有办法优化这个过程。请注意,我不允许在结果集的顶部创建视图,也不允许将结果集存储为另一个表(即,我只希望对数据库具有读取权限)。
下面应该提供我正在运行的查询的要点:
获取结果集的第一个查询:

SELECT *
FROM my_table
WHERE some_condition;

后续查询:

SELECT *
FROM table(result_scan('query_id_of_first_query'))
LIMIT 10000 OFFSET desired_offset;

以下是执行时间wrt offset值的基准:

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%。
但是,我需要更多的“软件”方法而不是“硬件”方法:)。

zbq4xfa0

zbq4xfa01#

这是一个很好的问题,你能扩展一下“我不允许将结果集存储为另一个表”吗?这包括创建一个临时表吗?实际上,从某种意义上说,snowflake就是这么做的。
你在多大的虚拟仓库上运行这个,你在query1中排序结果吗?
也许在select中添加一个伪列,按伪列排序,并在偏移量查询中使用伪列可以帮助您限制偏移量查询中处理的数据量。我这么说是因为最终目标是限制在每个查询中扫描的微分区的数量,所以这是我第一步要做的。如果您可以用集群键创建一个临时表,并在“偏移”逻辑中使用这些列,那么您也应该做得很好。
我希望这有助于…rich

相关问题