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

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

【问题讨论】:

标签: snowflake-cloud-data-platform


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 2021-04-05
    相关资源
    最近更新 更多