Snowflake query_history()仅返回当日查询 如何获取近7天查询记录
Snowflake查询最近7天全量查询记录的可行方案
1. 补充query_history()函数的显式时间范围参数
information_schema.query_history()存在未明确说明的返回优先级:当指定的RESULT_LIMIT小于目标时间范围内的查询总条数时,会优先返回最新的查询记录。若你的账户单日查询量已经超过你设置的10000阈值,就会仅返回当日数据。你需要显式传入时间范围参数,示例语句如下:
SELECT DATABASE_NAME, QUERY_TYPE, USER_NAME, START_TIME, EXECUTION_TIME FROM TABLE(information_schema.query_history( START_TIME => DATEADD('day', -7, CURRENT_TIMESTAMP()), END_TIME => CURRENT_TIMESTAMP(), RESULT_LIMIT => 10000 )) ORDER BY START_TIME DESC;
2. 拆分时间范围分段拉取,规避结果集上限
information_schema.query_history()的RESULT_LIMIT存在10000条的硬上限,即使设置更高数值也不会生效。如果你的账户7天内总查询量超过10000条,需要拆分时间范围分段拉取:
- 优先按天拆分,每天单独执行一次查询汇总结果
- 若单日查询量仍超过10000条,进一步按小时拆分时间范围拉取
3. 使用ACCOUNT_USAGE层的QUERY_HISTORY视图
要绕过information schema的函数结果限制,可以使用账号层级的SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY视图,该视图存储了账户内全量的查询历史,访问前需要确认当前角色已被授予MONITOR USAGE或更高权限,查询时增加时间过滤条件可以大幅提升加载速度,避免长时间等待:
SELECT DATABASE_NAME, QUERY_TYPE, USER_NAME, START_TIME, EXECUTION_TIME FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY WHERE START_TIME >= DATEADD('day', -7, CURRENT_TIMESTAMP()) ORDER BY START_TIME DESC;
权限排查
如果上述方案执行后仍只能看到部分查询记录,确认当前使用的角色权限:普通角色默认仅能查询当前用户自己的历史记录,要查看全账户所有用户的查询记录,需要角色被显式授予全账户查询监控权限,或使用ACCOUNTADMIN、SECURITYADMIN这类高权限角色执行查询。
内容的提问来源于stack exchange,提问作者Hennie de Nooijer
相关产品推荐
相关产品推荐

