如何获取Snowflake表使用排名及Python SQL解析库推荐
方案1(优先推荐):使用Snowflake内置ACCESS_HISTORY视图
Snowflake自带的ACCESS_HISTORY系统视图已经内置了查询涉及的所有对象解析结果,不需要手动解析SQL文本,准确率远高于自行解析,也能避免SQL语法复杂导致的解析遗漏(比如子查询、CTE、跨库跨schema引用、临时表等场景)。
你可以直接用以下SQL统计指定时间段的表查询次数排名:
SELECT BASE_OBJECTS_FULLY_QUALIFIED_NAME AS table_full_name, COUNT(DISTINCT QUERY_ID) AS query_count FROM SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY WHERE QUERY_START_TIME BETWEEN '【替换为统计起始时间】' AND '【替换为统计结束时间】' AND BASE_OBJECTS_FULLY_QUALIFIED_NAME IS NOT NULL -- 过滤系统内部查询,只保留用户发起的查询 AND IS_USER_INITIATED = TRUE GROUP BY BASE_OBJECTS_FULLY_QUALIFIED_NAME ORDER BY query_count DESC;
补充说明:
- ACCESS_HISTORY的数据保留时间根据你的Snowflake版本不同有差异,企业版默认保留1年,足以满足常规统计需求
- 结果里会自动展开查询中引用的所有表,包括视图底层依赖的物理表,不需要额外处理视图解析
方案2:手动解析SQL文本(仅当你需要处理ACCESS_HISTORY覆盖范围外的历史数据时使用)
如果确实需要自己解析SQL提取表名,Python常用的解析库有这几个,各有适用场景:
- sqlglot:支持几乎所有主流数据库SQL语法,包括Snowflake的专属语法,容错性高,支持直接提取AST中的表节点,是目前处理复杂SQL解析的首选
- sqloxide:基于Rust的sqlparser封装,解析速度极快,适合批量处理大量SQL文本,对标准SQL支持好,对Snowflake专属语法的兼容略逊于sqlglot
- sqlparse:轻量级非验证型解析库,不校验SQL语法正确性,只要是类SQL格式就能拆分出token,适合快速处理简单SQL,复杂嵌套场景下提取表名的准确率较低
你可以参考以下sqlglot提取表名的示例代码:
import sqlglot from sqlglot.expressions import Table def extract_table_names(sql: str) -> list: table_names = [] try: # 指定按Snowflake语法解析 ast = sqlglot.parse_one(sql, read="snowflake") for table in ast.find_all(Table): # 拼接全限定名:数据库.schema.表 full_name = ".".join(part.name for part in table.parts if part) table_names.append(full_name) # 去重返回 return list(set(table_names)) except Exception: # 解析失败的SQL可单独记录后人工处理 return []
补充说明:
- 自行解析无法100%覆盖所有复杂场景,比如动态SQL、字符串拼接生成的表名、临时表等都会导致结果不准
- 解析时必须指定
read="snowflake"参数,避免Snowflake专属语法导致的解析失败
内容的提问来源于stack exchange,提问作者SungJoon
相关产品推荐
相关产品推荐

