首页 > 解决方案 > 在 Snowflake 中执行异步查询时,结果集的 TTL 是多少?

问题描述

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

我们在 Snowflake 中异步执行长时间运行的 SELECT 查询,并每 5 秒使用查询 ID 轮询执行以获取状态和结果。

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

  1. 雪花如何以及在哪里存储结果集,在帐户/会话级别是否有任何可用的配置?

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

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

  4. 有没有办法我们可以计算出运行查询所需的大约时间,这将帮助我们确定同步或异步运行查询?

标签: snowflake-cloud-data-platformsnowflake-schema

解决方案


  1. 雪花如何以及在哪里存储结果集,在帐户/会话级别是否有任何可用的配置?

所有生成行的查询都将其结果保存在云主机的对象存储(S3、Azure Blob、GCP 存储)中。这是一个独立于对象存储的区域,用于内部阶段的表微分区和文件。唯一要配置的设置是相同的查询是否可以潜在地使用结果集缓存。alter session set use_cached_result = {true | false}. 请注意,将 used_cached_result 设置为 false 仍然允许您使用检索结果select * from table(result_scan('<query_id>'))

关于运行这样的查询的一个注意事项,当将 where 子句应用于结果集缓存时,分区修剪不可用。如果您打算过滤结果,请在创建原始结果集之前执行此操作,以确保有效的分区修剪。

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

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

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

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

您可以做的是获取您的选择并使用它来运行COPY INTO 语句。文档中描述了 COPY INTO 选项。使用外部阶段直接使用标准方法访问 S3。

查询完成后,根据结果集的大小,结果将转到一个或多个文件中的指定位置。您可以选择要写入的文件类型。截至 2021 年 10 月,选项为 CSV(以指定格式分隔)、Parquet 和 JSON。

这是一个简单的例子:

copy into @my_external_stage from (select * from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."NATION");
select $1, $2, $3, $4 from @my_external_stage;

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

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

  1. 有没有办法我们可以计算出运行查询所需的大约时间,这将帮助我们确定同步或异步运行查询?

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

最后说明:如果您使用的是 JDBC,则有一种方法可以获取查询 ID,而无需运行另一个 select 语句来获取最后一个查询 ID。这在 Snowflake JavaScript 存储过程 API 中也可用,在 Statement 对象上调用 getQueryId()。


推荐阅读