如何从历史表获取Snowflake中DML语句的正确处理行数
Snowflake获取DML语句实际处理行数的正确方案
information_schema.query_history()中的row_produced字段本身就不是用来统计DML处理行数的:这个字段记录的是SQL语句返回给客户端的结果集行数,普通DML执行后默认不会把受影响行作为结果集返回,所以这个字段值经常显示为0,和实际处理行数没有对应关系。
可以通过以下几种方式拿到准确的DML处理行数:
- 方法1:使用
rows_affected字段查询查询历史
之前取数字段错误,query_history中专门有rows_affected字段记录DML实际影响的行数,覆盖INSERT、UPDATE、DELETE、MERGE所有DML类型,直接查询即可:SELECT query_id, query_text, rows_affected AS actual_processed_rows, row_produced AS returned_to_client_rows -- 该字段为返回客户端的行数,不要用于统计DML影响行 FROM TABLE(information_schema.query_history()) WHERE query_type IN ('INSERT','UPDATE','DELETE','MERGE') AND start_time >= DATEADD('hour', -24, CURRENT_TIMESTAMP()); - 方法2:执行DML后通过
RESULT_SCAN实时获取
单条DML执行完成后,可以直接通过LAST_QUERY_ID()关联结果扫描函数,拿到当前会话最近一条DML的实际处理行数,准确性最高:-- 示例:执行UPDATE语句 UPDATE user_table SET user_status = 'inactive' WHERE last_login < '2023-01-01'; -- 立即查询该语句的实际影响行数 SELECT rows_affected FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())); - 方法3:存储过程/脚本中使用内置变量
SQLROWCOUNT
如果是在Snowflake脚本、存储过程中执行DML,可以直接调用内置变量SQLROWCOUNT获取最近一条DML的处理行数,不需要额外查表:BEGIN DELETE FROM log_table WHERE create_time < '2024-01-01'; LET deleted_count INT := SQLROWCOUNT; -- 变量值就是刚才DELETE实际删除的行数 RETURN deleted_count; END;
注意:如果DML语句写了
RETURNING子句返回指定行数据,row_produced会记录RETURNING子句输出的行数,和实际DML处理行数可能存在差异,比如更新1000行但只RETURNING 10行时,row_produced值为10,rows_affected依然是准确的1000,统计时注意区分。
内容的提问来源于stack exchange,提问作者Sghal9
相关产品推荐
相关产品推荐

