You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:24:04