Snowflake执行异步查询时结果集的TTL是多少?

What is the TTL for a Result set when Asynchronous Query is executed in Snowflake?

参考此文档:https://docs.snowflake.com/en/user-guide/jdbc-using.html#performing-an-asynchronous-query

我们正在 Snowflake 中异步执行 Long-运行 SELECT 查询,并每 5 秒使用查询 ID 轮询一次执行以获取状态和结果。

我看到即使在读取结果集后,我们也可以在一天后多次读取结果集。

  1. snowflake如何以及在哪里存储结果集,在account/session级别是否有可用的配置?

  2. 异步操作的查询结果的 TTL 是多少?有没有办法在读取结果集后删除查询。

  3. 有没有办法直接从 Snowflake 上传 ResultSet 以执行异步查询到 S3?

  4. 有没有一种方法可以计算出对 运行 进行查询所需的大约时间,这将帮助我们识别 运行 同步查询或异步 ?

我相信你在谈论查询结果缓存。执行查询时,结果会在虚拟仓库级别保留(即缓存)一段时间。在时间段结束时,结果将从系统中清除。

每次重复使用查询的持久化结果时,Snowflake 都会重置结果的 24 小时保留期,最长为自首次执行查询的日期和时间起 31 天。 31 天后,结果被清除,下次提交查询时,将生成新结果并保存。

您无法直接控制虚拟仓库缓存。可以通过挂起仓库来清空缓存:

ALTER WAREHOUSE <wh_name> SUSPEND;

你也可以让Snowflake一起绕过缓存:

ALTER SESSION SET use_cached_result = FALSE;

您可以使用 RESULT_SCAN table 函数通过查询访问结果缓存:

SELECT * FROM TABLE(RESULT_SCAN(last_query_id())) 

要获取查询 ID,您可以使用 QUERY_HISTORYQUERY_HISTORY_BY_*、table 函数或 LAST_QUERY_ID 函数。您可以使用它来将结果卸载到 S3 中。

我所知道的估计 运行 时间的唯一方法是在较小的数据样本上检查 运行 次,然后进行推断(可能有 better/easier 方法)

  1. How and where does snowflake store the result set, is there any config available for this at the account/session level?

所有 row-producing 查询的结果都保存在云主机的 object 存储(S3、Azure Blob、GCP 存储)中。该区域与您的 object 存储区分开,用于存储 table micro-partitions 和内部阶段的文件。唯一要配置的设置是相同的查询是否可以潜在地使用结果集缓存。 alter session set use_cached_result = {true | false}。请注意,将 used_cached_result 设置为 false 仍然允许您使用 select * from table(result_scan('<query_id>'))

检索结果

关于 运行ning 查询的一个注释,分区 p运行ing 在将 where 子句应用于结果集缓存时不可用。如果要过滤结果,请在创建原始结果集之前进行过滤,以确保有效分区 p运行ing.

  1. What is the TTL for the Query Result of the Async Operation ? and is there a way to delete the query after reading the ResultSet.

罗伯特的回答全面涵盖了这一点。

  1. Is there a way we can directly upload the ResultSet from Snowflake for an Async Query Execution to S3?

您不能上传结果集,但如果目标是将结果写入您自己的 S3 区域而不是结果集缓存,则可以这样做。是否值得复杂性取决于您。

你能做的就是把你的 select 用于 运行 和 COPY INTO statement。文档中描述了 COPY INTO 选项。使用外部阶段直接使用标准方法访问 S3。

查询完成后,结果将转到一个或多个文件中的指定位置,具体取决于结果集的大小。您可以 select 要写入的文件类型。自 2021 年 10 月起,选项为 CSV(以指定格式分隔)、Parquet 和 JSON.

这是一个简单的例子:

copy into @my_external_stage from (select * from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."NATION");
select , , ,  from @my_external_stage;

https://docs.snowflake.com/en/sql-reference/sql/copy-into-location.html

您需要将文件复制到跨 运行 秒的不同位置或使用不同的文件名,因为文件名冲突会导致错误。

  1. Is there a way we can figure out what is the approx time that will take a Query to run, This will help us identify to run the queries Synchronously or Asynchronously ?

Web ui 显示扫描进度信息,因此可用于 REST API。我从来没有见过这样暴露的driver。在任何情况下,它都会显示扫描时间,这并不总是与总体查询时间一致。

最后说明:如果您使用 JDBC,有一种方法可以获取查询 ID,而无需 运行 另一个 select 语句来获取最后一个查询 ID。这在 Snowflake JavaScript 存储过程 API 中也可用,在语句 object.

上称为 getQueryId()