运行JavaScript存储过程时如何通过QUERY_HISTORY获取关联子SQL
结论
完全可以通过QUERY_HISTORY视图实现你提出的两个查询需求,具体实现逻辑和需要用到的关联属性如下:
1. 定位存储过程调用运行记录
筛选存储过程主调用记录的核心判断字段如下:
QUERY_TYPE:值固定为CALL的记录就是存储过程的主调用记录QUERY_TEXT:可以配合模糊匹配你要找的存储过程名称,缩小筛选范围START_TIME、SESSION_ID:可以按需补充时间范围、会话维度过滤条件,定位特定场景下的存储过程调用记录
2. 关联存储过程主调用与内部子SQL的核心属性
只需要两个属性即可完成主调用和子SQL的关联匹配:
SESSION_ID:同一个存储过程的主调用和它内部执行的所有子SQL必然属于同一会话,该字段值完全一致PARENT_QUERY_ID:存储过程内部执行的每一条子SQL的PARENT_QUERY_ID,刚好等于该存储过程主调用记录的QUERY_ID
关联查询示例SQL
-- 先筛选出目标存储过程的主调用记录 WITH sp_main_calls AS ( SELECT QUERY_ID AS sp_query_id, QUERY_TEXT AS sp_call_text, START_TIME AS sp_start_time, SESSION_ID FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY WHERE QUERY_TYPE = 'CALL' AND QUERY_TEXT ILIKE '%YOUR_STORED_PROCEDURE_NAME%' -- 可按需补充时间范围过滤 AND START_TIME >= DATEADD('day', -7, CURRENT_TIMESTAMP()) ) -- 关联查询对应子SQL SELECT sp.sp_call_text, qh.QUERY_ID AS child_sql_id, qh.QUERY_TEXT AS child_sql_text, qh.START_TIME AS child_start_time, qh.END_TIME AS child_end_time, qh.QUERY_TYPE AS child_query_type, qh.ERROR_MESSAGE AS child_error_msg FROM sp_main_calls sp JOIN SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY qh ON sp.SESSION_ID = qh.SESSION_ID AND sp.sp_query_id = qh.PARENT_QUERY_ID ORDER BY sp.sp_start_time DESC, child_start_time ASC;
注意事项
如果你的场景存在存储过程嵌套调用的情况(即存储过程内部还调用了其他存储过程),可以把上述关联逻辑改成递归CTE,就能查询出整个调用链路下的所有层级子SQL。
内容的提问来源于stack exchange,提问作者akshindesnowflake
相关产品推荐
相关产品推荐

