snowflake-cloud-data-platform - 在 Snowflake 中执行异步查询时,结果集的 TTL 是多少?
问题描述
参考本文档:https ://docs.snowflake.com/en/user-guide/jdbc-using.html#performing-an-asynchronous-query
我们在 Snowflake 中异步执行长时间运行的 SELECT 查询,并每 5 秒使用查询 ID 轮询执行以获取状态和结果。
我看到即使在阅读了结果集之后,我们也可以在一天之后多次阅读结果集。
雪花如何以及在哪里存储结果集,在帐户/会话级别是否有任何可用的配置?
异步操作的查询结果的 TTL 是多少?有没有办法在阅读 ResultSet 后删除查询。
有没有办法我们可以直接从 Snowflake 上传 ResultSet 以执行异步查询到 S3?
有没有办法我们可以计算出运行查询所需的大约时间,这将帮助我们确定同步或异步运行查询?
解决方案
- 雪花如何以及在哪里存储结果集,在帐户/会话级别是否有任何可用的配置?
所有生成行的查询都将其结果保存在云主机的对象存储(S3、Azure Blob、GCP 存储)中。这是一个独立于对象存储的区域,用于内部阶段的表微分区和文件。唯一要配置的设置是相同的查询是否可以潜在地使用结果集缓存。alter session set use_cached_result = {true | false}
. 请注意,将 used_cached_result 设置为 false 仍然允许您使用检索结果select * from table(result_scan('<query_id>'))
关于运行这样的查询的一个注意事项,当将 where 子句应用于结果集缓存时,分区修剪不可用。如果您打算过滤结果,请在创建原始结果集之前执行此操作,以确保有效的分区修剪。
- 异步操作的查询结果的 TTL 是多少?有没有办法在阅读 ResultSet 后删除查询。
罗伯特的回答全面涵盖了这一点。
- 有没有办法我们可以直接从 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
您需要在运行过程中将文件复制到不同的位置或使用不同的文件名,因为文件名冲突会导致错误。
- 有没有办法我们可以计算出运行查询所需的大约时间,这将帮助我们确定同步或异步运行查询?
Web ui 显示扫描进度信息,因此可用于 REST API。我从来没有见过暴露在司机面前。在任何情况下,它都会显示扫描时间,这并不总是与整体查询时间保持一致。
最后说明:如果您使用的是 JDBC,则有一种方法可以获取查询 ID,而无需运行另一个 select 语句来获取最后一个查询 ID。这在 Snowflake JavaScript 存储过程 API 中也可用,在 Statement 对象上调用 getQueryId()。
推荐阅读
- sql-server - 无法同时通过 VPN 连接到 RDP 和 SQL Server(Azure)
- javascript - 转换 Observable
到可观察的 - python - 使用 python 3 在 windows 中安装 Poppler
- docker - Docker Windows如何在不登录的情况下保持容器运行?
- javascript - 如何从 p2 中删除隐藏的属性()?似乎没有按原样做任何事情
- ruby - 无法通过 rspec 中的测试
- c - 可以在没有堆栈和递归的情况下在 C 中实现快速排序吗?
- c++ - 结合c ++中的变量类型
- python - Python 3.5 与 3.7 进程时间
- javascript - 如何将枚举转换为打字稿中的键值数组?