Snowflake中判断待运行JavaScript存储过程是否正在运行的方案是否正确
Snowflake存储过程运行状态判断方案说明
两个查询语句的区别
SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY是账号级查询历史视图:
可查询全账号所有数据库、所有用户的查询记录,但是存在最高2小时的数据延迟,完全不适合做实时运行状态判断,且需要账号级权限才能访问。<你的数据库名>.INFORMATION_SCHEMA.QUERY_HISTORY是数据库级查询历史视图:
仅可查询当前数据库范围内的查询记录,数据延迟远低于ACCOUNT_USAGE视图,但默认只保留最近7天、最多10000条查询记录。
现有方案的问题
你当前的实现逻辑是完全错误的,存在两个核心问题:
- 未加目标存储过程的过滤条件:你写的SQL会匹配所有处于RUNNING状态的查询,只要当前账号/数据库有任意正在运行的任务,就会返回RUNNING,根本无法定位到你要启动的目标存储过程是否真的在运行。
- 视图选型不合理: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
相关产品推荐
相关产品推荐

