首先感谢您的帮助!
我想找出数据库中哪些表的使用率最高,即查询该表的用户量、查询次数、每个表的用户消耗的资源、该表的总时间查询以及任何其他有用的数据。 现在我将分析限制在 9 个特定的表上。 我尝试使用 stl_scan 和 pg_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和名称。
通过此查询,我可以获得一些信息,但我需要更多详细信息。令人惊讶的是,网上关于此类统计数据的数据并不多。
再次谢谢大家!
干得好!使用
stl_scan
表,您走在正确的轨道上。我不清楚您正在寻找哪些进一步的详细信息。
SVL_QUERY_METRICS_SUMMARY
视图。请注意,这些数据是通过查询而不是表来汇总的,因为查询是利用资源的主要方式。
通常,请查看 GitHub 上 Redshift Utils 库中的 管理查询(和视图),特别是
v_get_tbl_scan_frequency.sql
感谢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和名称。
下面的查询为您提供了有关表、模式以及对其运行查询的用户的准确信息。我创建了一个表并插入所有行以进行更好的分析和聚合,希望它有帮助!!
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;