Snowflake异步查询执行的结果集TTL及相关技术问题咨询
问题1:Snowflake如何、在何处存储Result set?是否存在account级别或session级别的相关配置项?
Snowflake的查询结果集默认存储在服务端内部云存储层,和你部署Snowflake的云厂商区域对应(比如AWS区域就存在对应S3存储区),归查询触发用户所属的虚拟仓库管理,不会占用你账户的用户数据存储配额。
配置方面仅有账户级别的结果集保留时长全局参数,没有会话级别的独立配置项,规则对全账户所有查询统一生效。
问题2:Async Operation的查询结果TTL是多少?读取ResultSet后是否有方法可以删除对应查询的结果?
异步查询的结果集TTL和同步查询完全一致:标准版账户默认保留24小时,企业版及以上账户默认保留45天,最长可调整到90天。
目前没有公开接口支持主动删除单条查询的结果集,结果只能到期后自动被系统回收。
问题3:是否可以将Snowflake中Async Query Execution生成的ResultSet直接上传到S3?
可以,无需把结果集读取到应用端再上传,全程可在Snowflake服务端完成。你拿到异步查询的query ID后,调用COPY INTO结合RESULT_SCAN函数即可导出,参考语法:
COPY INTO 's3://<你的目标S3路径>/<导出文件前缀>' FROM (SELECT * FROM TABLE(RESULT_SCAN('<异步查询的QUERY_ID>'))) STORAGE_INTEGRATION = <你提前配置的S3存储集成名称> FILE_FORMAT = (TYPE = CSV); -- 可按需调整为PARQUET等其他格式
问题4:是否有方法可以预估查询的大致运行时长,以帮助判断应该采用Synchronously还是Asynchronously方式执行查询?
有两种常用的估算方式:
- 若查询是历史重复执行过的,可通过
QUERY_HISTORY视图查询同逻辑查询的历史平均耗时,参考语法:
SELECT AVG(TOTAL_ELAPSED_TIME)/1000 AS avg_run_seconds FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY()) WHERE QUERY_TEXT ILIKE '%<你的查询特征标识>%' AND EXECUTION_STATUS = 'SUCCESS';
- 若为首次执行的新查询,可先运行
EXPLAIN ANALYZE <你的查询语句>获取执行计划,里面会给出预估扫描数据量、计算节点资源消耗等指标,你可结合同数据量级的历史查询耗时做估算。
一般建议预估耗时超过你应用设置的JDBC同步超时阈值的查询,都采用异步执行方式。
内容的提问来源于stack exchange,提问作者Santosh Mohanty
相关产品推荐
相关产品推荐

