从雪花历史中的query_text中提取表

Posted

技术标签:

【中文标题】从雪花历史中的query_text中提取表【英文标题】:extract table from query_text in history in snowflake 【发布时间】:2021-06-01 12:39:41 【问题描述】:

我必须知道 snowflake 中查询最多的表,所以想从 Snowflake_query_history 表中的 query_text 中提取表名。有没有办法在 SQL 中做到这一点。

【问题讨论】:

在***.com/a/64343564/132438查看我之前的回答 【参考方案1】:

您可以使用ACCESS_HISTORY 视图来代替解析query_text

查询可能如下所示:

SELECT f1.value:"objectId" AS table_id, COUNT(*) AS cnt
FROM "SNOWFLAKE"."ACCOUNT_USAGE".access_history
     ,LATERAL flatten(base_objects_accessed) f1
WHERE f1.value:"objectDomain"::string='Table'
  AND query_start_time >= dateadd('day', -30, current_timestamp())  -- last 30 days
GROUP BY table_id
ORDER BY cnt DESC;

使用TABLE_ID 列作为查找,可以在SNOWFLAKE.ACCOUNT_USAGE.TABLES 中找到实际的表名。

【讨论】:

只是添加使用 ACCOUNT_HISTORY 视图的警告。这似乎只有在您拥有 Snowflake Enterprise 而不是 Standard 时才可用。【参考方案2】:

另请参阅:Snowflake - View what tables and columns are queried the most

以高精度做到这一点是相当困难的,但如果可以接受合理接近,那么以下可能就足够了。

此查询不会处理连接、联合、子查询、多个 CTE 等 - 这将很难用 REGEXP 完成,并且更适合通过 Snowflake Python 连接器在 Python 中完成,例如pglast

select REGEXP_SUBSTR(query_text, ' from ([^\\ ]*)', 1, 1, 'ie', 1) table_name,count(*) query_count from "SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY" group by 1 order by 2 desc;

TABLE_NAME  QUERY_COUNT
table_a 95
"SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY" 5

【讨论】:

以上是关于从雪花历史中的query_text中提取表的主要内容,如果未能解决你的问题,请参考以下文章

如何从雪花数据库中的表中删除前 N 条记录

在雪花中缓存

如何删除雪花数据库表中的重复记录

将 SQL 表中的所有数据提取到我的 Python 代码中

使用雪花中的存储过程将值插入表中

雪花中的 JavaScript UDF