如何找到 Redshift 中访问次数最多的表?

Alo*_*ngh 2 amazon-web-services amazon-redshift

我们正在将实时数据传输到 Redshift。瓶颈是没有可以并发运行的表加载。目前,我们每 15 分钟运行超过 1000 个负载。

但我们希望根据用户使用这些表的频率来减少这个数字。请建议我们如何在 Redshift 中获取此信息。

Alo*_*ngh 5

这个由awslabs开源的视图可以用来查询最常查询的表。

创建视图

CREATE OR REPLACE VIEW admin.v_get_table_scan_frequency
AS
SELECT 
    database, 
    schema AS schemaname, 
    table_id, 
    "table" AS tablename, 
    size, 
    sortkey1, 
    NVL(s.num_qs,0) num_qs
FROM svv_table_info t
LEFT JOIN (SELECT
   tbl, perm_table_name,
   COUNT(DISTINCT query) num_qs
FROM
   stl_scan s
WHERE 
   s.userid > 1
   AND s.perm_table_name NOT IN ('Internal Worktable','S3')
GROUP BY 
   tbl, perm_table_name) s ON s.tbl = t.table_id
AND t."schema" NOT IN ('pg_internal')
ORDER BY 7 desc;
Run Code Online (Sandbox Code Playgroud)

桌子

\d admin.v_get_table_scan_frequency
   Column   |  Type  | Modifiers
------------+--------+-----------
 database   | text   |
 schemaname | text   |
 table_id   | oid    |
 tablename  | text   |
 size       | bigint |
 sortkey1   | text   |
 num_qs     | bigint |
Run Code Online (Sandbox Code Playgroud)

询问

select * from admin.v_get_table_scan_frequency order by num_qs;
Run Code Online (Sandbox Code Playgroud)

结果

database | schemaname | table_id | tablename | size  | sortkey1      | num_qs
-----------------+------------+----------+------------------------------------------+-------+---------------+--------
 db      | product    | 1        | table1    |    92 | AUTO(SORTKEY) |  13448
 db      | product    | 2        | table2    |   180 | AUTO(SORTKEY) |  13389
Run Code Online (Sandbox Code Playgroud)

在 Prometheus 中保存此查询的时间序列数据可以帮助找到每个表随时间变化的速率和频率趋势。基于此,我们可以决定在 Redshift 中刷新数据的频率。