You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake中判断待运行JavaScript存储过程是否正在运行的方案是否正确

Snowflake存储过程运行状态判断方案说明

两个查询语句的区别

  • SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY 是账号级查询历史视图:
    可查询全账号所有数据库、所有用户的查询记录,但是存在最高2小时的数据延迟,完全不适合做实时运行状态判断,且需要账号级权限才能访问。
  • <你的数据库名>.INFORMATION_SCHEMA.QUERY_HISTORY 是数据库级查询历史视图:
    仅可查询当前数据库范围内的查询记录,数据延迟远低于ACCOUNT_USAGE视图,但默认只保留最近7天、最多10000条查询记录。

现有方案的问题

你当前的实现逻辑是完全错误的,存在两个核心问题:

  1. 未加目标存储过程的过滤条件:你写的SQL会匹配所有处于RUNNING状态的查询,只要当前账号/数据库有任意正在运行的任务,就会返回RUNNING,根本无法定位到你要启动的目标存储过程是否真的在运行。
  2. 视图选型不合理:QUERY_HISTORY视图始终存在一定延迟,无法捕获到刚刚触发的存储过程运行状态。

正确实现方案

优先使用实时查询函数CURRENT_QUERIES()做状态判断,它没有数据延迟,专门用于返回当前账号/会话正在执行的查询记录,示例查询如下:

SELECT COUNT(*) AS RUNNING_COUNT
FROM TABLE(INFORMATION_SCHEMA.CURRENT_QUERIES())
WHERE QUERY_TYPE = 'CALL' -- 匹配存储过程调用请求
AND QUERY_TEXT LIKE '%<你的存储过程名称>%' -- 替换为你要判断的存储过程名
AND EXECUTION_STATUS = 'RUNNING';

如果查询返回的RUNNING_COUNT大于0,说明目标存储过程已经有实例在运行,你就可以终止本次调用。

补充注意事项:

  • 如果你的存储过程名称可能出现在其他查询的SQL文本里,可以额外加执行角色、调用参数等过滤条件避免误判。
  • 如果需要跨数据库做全账号范围的存储过程状态校验,可以把CURRENT_QUERIES()替换为SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY,但需要额外增加时间范围过滤(比如只查最近15分钟的记录)降低延迟带来的漏判风险。

内容的提问来源于stack exchange,提问作者akshindesnowflake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:45:04