【问题标题】:Result Cache size in Snowflake雪花中的结果缓存大小
【发布时间】:2021-08-21 21:22:51
【问题描述】:

Snowflake 中的结果缓存非常有用。

我正在尝试的一个用例是在数据仓库中运行用户的查询后批量加载,以便缓存结果。并且当业务用户在 2-3 小时后运行相同的查询时,可能使用最小的仓库,数据将从缓存中返回。

但我需要了解结果缓存的容量。我们能否知道结果缓存可以存储多少行。

假设用户查询提取了一百万行。雪花会将所有百万行存储在结果缓存中。或者假设有 1 亿行。

一旦容量被破坏,数据将存储在哪里。以及我们如何知道容量以及何时被破坏

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    结果集缓存的大小没有实际限制。时间限制是自上次使用结果集以来的 24 小时:

    每次重复使用查询的持久化结果时,Snowflake 都会重置 结果的 24 小时保留期,最多 31 从第一次执行查询的日期和时间算起的天数。后 31天,结果被清除,下次查询时 提交后,会生成一个新的结果并持久化。

    https://docs.snowflake.com/en/user-guide/querying-persisted-results.html

    一些额外的注意事项:

    1. 运行相同的查询并不能保证使用结果集缓存。必须满足 8 个条件,即使这样也不能保证使用结果集缓存。 https://docs.snowflake.com/en/user-guide/querying-persisted-results.html#retrieval-optimization
    2. 为保证使用结果集缓存,而不是在24小时内运行相同的查询,可以运行select * from table(result_scan('019caf93-0500...'));
    3. 如果你不对结果集做任何处理/过滤,只做一个 select *,它甚至不需要运行仓库。
    4. 请注意,如果您像 #2 中那样运行查询,如果基础表中的数据发生更改,则不会更改结果。再次运行生成结果集的原始语句将执行此操作(表更改是第 1 点中的 8 个标准之一),但不太可能重用结果。
    5. 如果您使用 result_scan 函数,您可以将其视为任何表并将其与其他表连接、过滤、在其上运行函数等。除了简单的未过滤选择之外,其他任何操作都需要运行仓库。仓库大小可能比最初用于创建结果集的仓库要小得多。例如,一个复杂的查询可以消化结果,然后有人可以通过 result_scan 函数使用结果集按行过滤或对主查询的预处理结果执行更简单的查询。

    【讨论】:

    • 谢谢格雷格。所以你说如果我的查询返回 10 亿行或数百万行,它将保留在结果缓存中。我在想会有任何限制,因为结果缓存必须是在内存中存储数据的单独计算
    • 它没有存储在内存中。它存储在对象存储中(S3、Azure Blob、Google 存储,具体取决于云平台)。
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 2021-12-03
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多