Snowflake - 查看哪些表和列被查询最多

000*_*004 2 snowflake-cloud-data-platform

在 Snowflake/sql 查询中是否有任何方法可以查看查询最多的表以及哪些列?我想知道哪些数据对我的用户最有价值,但不确定如何以编程方式执行此操作。任何想法表示赞赏 - 谢谢!

Fel*_*ffa 7

2021年更新

新的 ACCESS_HISTORY 视图包含此信息(目前处于预览状态,企业版)。

例如,如果您想查找最常用的列:

select obj.value:objectName::string objName
    , col.value:columnName::string colName
    , count(*) uses
    , min(query_start_time) since
    , max(query_start_time) until
from snowflake.account_usage.access_history 
    , table(flatten(direct_objects_accessed)) obj
    , table(flatten(obj.value:columns)) col
group by 1, 2
order by uses desc
Run Code Online (Sandbox Code Playgroud)

参考:https://docs.snowflake.com/en/sql-reference/account-usage/access_history.html


2020年答案

我发现的最好的(目前):

  • 对于任何给定的查询,您可以通过查看为其生成的计划来找到扫描了哪些表:
SELECT *, "objects"
FROM TABLE(EXPLAIN_JSON(SYSTEM$EXPLAIN_PLAN_JSON('SELECT * FROM a.b.any_table_or_view')))
WHERE "operation"='TableScan'
Run Code Online (Sandbox Code Playgroud)
  • 您也可以找到所有以前运行的查询:
select QUERY_TEXT 
from table(information_schema.query_history())
Run Code Online (Sandbox Code Playgroud)

因此,下一步自然是将两者结合起来 - 但这并不简单,因为您会收到如下错误:

SQL compilation error: argument 1 to function EXPLAIN_JSON needs to be constant, found 'SYSTEM$EXPLAIN_PLAN_JSON('SELECT * FROM a.b.c')'
Run Code Online (Sandbox Code Playgroud)

query_history()解决方案是将来自外部的查询结合起来SYSTEM$EXPLAIN_PLAN_JSON(使字符串恒定),然后您将能够找到查询次数最多的表。