如何在Snowflake中查询特定时间范围内正在运行的查询?
解决方案
方法1:分片调用QUERY_HISTORY函数,按时间窗口拆分规避1万行限制
QUERY_HISTORY函数支持指定时间范围参数,你可以把过去1小时拆成多个小的时间窗口(比如每10分钟一个窗口),分别调用函数查询再合并结果,就能避开单次调用1万行的上限。如果团队查询量极高,还可以把时间窗口拆得更小,只要单个窗口内的查询量不超过1万就不会漏数据。
示例代码:
-- 按10分钟分片查询过去1小时所有运行中任务,合并结果 SELECT * FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY( DATEADD('minute', -60, CURRENT_TIMESTAMP()), DATEADD('minute', -50, CURRENT_TIMESTAMP()) )) WHERE EXECUTION_STATUS = 'RUNNING' UNION ALL SELECT * FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY( DATEADD('minute', -50, CURRENT_TIMESTAMP()), DATEADD('minute', -40, CURRENT_TIMESTAMP()) )) WHERE EXECUTION_STATUS = 'RUNNING' UNION ALL -- 以此类推补全剩下4个10分钟窗口即可 SELECT * FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY( DATEADD('minute', -10, CURRENT_TIMESTAMP()), CURRENT_TIMESTAMP() )) WHERE EXECUTION_STATUS = 'RUNNING';
方法2:使用QUERY_HISTORY_BY_*系列函数缩小查询范围
如果不需要查询全账号的所有任务,可以按用户、仓库、会话维度过滤,使用对应的QUERY_HISTORY_BY_USER、QUERY_HISTORY_BY_WAREHOUSE、QUERY_HISTORY_BY_SESSION函数,这些函数同样支持时间范围参数,单个维度下的查询量通常远低于全账号总量,也能避免触达1万行上限。
示例按仓库查询代码:
SELECT * FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY_BY_WAREHOUSE( WAREHOUSE_NAME => '你的业务仓库名', END_TIME_RANGE_START => DATEADD('hour', -1, CURRENT_TIMESTAMP()), END_TIME_RANGE_END => CURRENT_TIMESTAMP() )) WHERE EXECUTION_STATUS = 'RUNNING';
方法3:开启Account Usage QUERY_HISTORY视图低延迟同步
如果你的Snowflake版本支持,可以开启ACCOUNT_USAGE.QUERY_HISTORY视图的低延迟同步能力,开启后运行中的任务会在秒级同步到该视图中,该视图没有1万行的返回限制,直接写过滤条件即可查询符合要求的任务:
SELECT * FROM "SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY" WHERE START_TIME >= DATEADD('hour', -1, CURRENT_TIMESTAMP()) AND EXECUTION_STATUS = 'RUNNING' AND TOTAL_ELAPSED_TIME > 3600000; -- 过滤运行时长超过1小时的任务,单位为毫秒
注意该功能开启后可能产生额外的云服务成本,可根据团队需求选择。
内容的提问来源于stack exchange,提问作者SungJoon
相关产品推荐
相关产品推荐

