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 轮询一次执行以获取状态和结果。
我看到即使在读取结果集后,我们也可以在一天后多次读取结果集。
snowflake如何以及在哪里存储结果集,在account/session级别是否有可用的配置?
异步操作的查询结果的 TTL 是多少?有没有办法在读取结果集后删除查询。
有没有办法直接从 Snowflake 上传 ResultSet 以执行异步查询到 S3?
有没有一种方法可以计算出对 运行 进行查询所需的大约时间,这将帮助我们识别 运行 同步查询或异步 ?
我相信你在谈论查询结果缓存。执行查询时,结果会在虚拟仓库级别保留(即缓存)一段时间。在时间段结束时,结果将从系统中清除。
每次重复使用查询的持久化结果时,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_HISTORY
、QUERY_HISTORY_BY_*
、table 函数或 LAST_QUERY_ID
函数。您可以使用它来将结果卸载到 S3 中。
我所知道的估计 运行 时间的唯一方法是在较小的数据样本上检查 运行 次,然后进行推断(可能有 better/easier 方法)
- 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.
- 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.
罗伯特的回答全面涵盖了这一点。
- 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
您需要将文件复制到跨 运行 秒的不同位置或使用不同的文件名,因为文件名冲突会导致错误。
- 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()
参考此文档:https://docs.snowflake.com/en/user-guide/jdbc-using.html#performing-an-asynchronous-query
我们正在 Snowflake 中异步执行 Long-运行 SELECT 查询,并每 5 秒使用查询 ID 轮询一次执行以获取状态和结果。
我看到即使在读取结果集后,我们也可以在一天后多次读取结果集。
snowflake如何以及在哪里存储结果集,在account/session级别是否有可用的配置?
异步操作的查询结果的 TTL 是多少?有没有办法在读取结果集后删除查询。
有没有办法直接从 Snowflake 上传 ResultSet 以执行异步查询到 S3?
有没有一种方法可以计算出对 运行 进行查询所需的大约时间,这将帮助我们识别 运行 同步查询或异步 ?
我相信你在谈论查询结果缓存。执行查询时,结果会在虚拟仓库级别保留(即缓存)一段时间。在时间段结束时,结果将从系统中清除。
每次重复使用查询的持久化结果时,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_HISTORY
、QUERY_HISTORY_BY_*
、table 函数或 LAST_QUERY_ID
函数。您可以使用它来将结果卸载到 S3 中。
我所知道的估计 运行 时间的唯一方法是在较小的数据样本上检查 运行 次,然后进行推断(可能有 better/easier 方法)
- 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.
- 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.
罗伯特的回答全面涵盖了这一点。
- 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
您需要将文件复制到跨 运行 秒的不同位置或使用不同的文件名,因为文件名冲突会导致错误。
- 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()