在 Redshift 中哪里可以找到使用情况统计信息?

问题描述 投票:0回答:3

首先感谢您的帮助!

我想找出数据库中哪些表的使用率最高,即查询该表的用户量、查询次数、每个表的用户消耗的资源、该表的总时间查询以及任何其他有用的数据。 现在我将分析限制在 9 个特定的表上。 我尝试使用 stl_scanpg_user 使用接下来的两个查询:

SELECT
    s.perm_table_name           AS table_name,
    count(*)                    AS qty_query,
    count(DISTINCT s.userid)    AS qty_users
FROM stl_scan s
JOIN pg_user b
    ON s.userid = b.usesysid
JOIN temp_mone_tables tmt
    ON tmt.table_id = s.tbl AND tmt.table = s.perm_table_name
WHERE s.userid > 1
GROUP BY 1
ORDER BY 1;

SELECT
    b.usename                                       AS user_name,
    count(*)                                        AS qty_scans,
    count(DISTINCT s.tbl)                           AS qty_tables,
    count(DISTINCT trunc(starttime))                AS qty_days
FROM stl_scan s
JOIN pg_user b
    ON s.userid = b.usesysid
JOIN temp_mone_tables tmt
    ON tmt.table_id = s.tbl AND tmt.table = s.perm_table_name
WHERE s.userid > 1
GROUP BY 1
ORDER BY 1;

temp_mone_tables是一个时态表,其中包含我感兴趣的表的ID和名称。

通过此查询,我可以获得一些信息,但我需要更多详细信息。令人惊讶的是,网上关于此类统计数据的数据并不多。

再次谢谢大家!

sql amazon-redshift database-administration usage-statistics
3个回答
12
投票

干得好!使用

stl_scan
表,您走在正确的轨道上。我不清楚您正在寻找哪些进一步的详细信息。

有关资源使用情况的详细指标,您可能需要使用

SVL_QUERY_METRICS_SUMMARY
视图。请注意,这些数据是通过查询而不是表来汇总的,因为查询是利用资源的主要方式。

通常,请查看 GitHub 上 Redshift Utils 库中的 管理查询(和视图),特别是

v_get_tbl_scan_frequency.sql


2
投票

感谢Joe Harris'的回答,我能够在之前的查询中添加很多信息。通过 svl_query_metrics_summary 连接到 stl_scan,您可以获得有关资源消耗的重要数据,可以将这些信息扩展为将它们连接到 Joe 的答案中列出的大量视图。

对我来说,解决方案从下一个查询开始:

SELECT *
FROM stl_scan ss
JOIN pg_user pu
    ON ss.userid = pu.usesysid
JOIN svl_query_metrics_summary sqms
    ON ss.query = sqms.query
JOIN temp_mone_tables tmt
    ON tmt.table_id = ss.tbl AND tmt.table = ss.perm_table_name

查询为您提供了大量数据,可以根据需要以多种方式进行汇总。

请记住,temp_mone_tables是一个临时表,其中包含我感兴趣的表的tableid和名称。


0
投票

下面的查询为您提供了有关表、模式以及对其运行查询的用户的准确信息。我创建了一个表并插入所有行以进行更好的分析和聚合,希望它有帮助!!

CREATE TABLE user_query_access_v1 AS
SELECT
q.userid,
TRANSLATE(u.usename::text, '\x80-\xFF', '') AS user_name,
q.query,
q.starttime,
s.tbl AS table_id,
t.database AS database_name,
t.schema AS schema_name,
t.table AS table_name,
TRANSLATE(q.querytxt::text, '\x80-\xFF', '') AS query_text
FROM 
    stl_query q
JOIN 
    stl_scan s ON q.query = s.query
JOIN 
    pg_user u ON q.userid = u.usesysid
JOIN 
    svv_table_info t ON s.tbl = t.table_id
WHERE 
    q.userid>1  -- Exclude system queries
    AND q.starttime>= '2024-01-01'  -- Adjust the date range as needed
ORDER BY 
    q.starttime DESC;
© www.soinside.com 2019 - 2024. All rights reserved.