我想在 Amazon Redshift 的系统表和视图之间匹配查询 ID。
简短描述
对于 SYS 视图(例如 SYS_QUERY_HISTORY),您可以使用 query_id 列作为查询 ID。对于 STL/SVL 表和视图(例如 STL_QUERY),您可以使用 query 列作为查询 ID。query 列用于标识 Amazon Redshift 在处理原始查询时生成的重写子查询。有关详细信息,请参阅使用 SYS 监控视图改进查询标识符跟踪。
解决方法
授予对系统表的访问权限
要在 Amazon Redshift 的系统表之间匹配查询 ID,用户必须是超级用户,或者拥有必要的权限。有关如何向特定用户授予访问权限的信息,请参阅系统表和视图中的数据可见性。
要向特定用户授予访问权限并分配系统定义的角色,请运行以下命令:
GRANT ROLE sys:monitor TO database_user;
**注意:**请将 database_user 替换为您的数据库用户。
关联查询 ID
Amazon Redshift 可能无法提供 query_id 列与 query 列之间的精确匹配。但是,您可以搜索 SYS 表与 STL/SVL 表之间的潜在匹配项。
在以下查询中,使用 SYS 中的 query_id 获取 STL/SVL 中的查询 ID:
SELECT query_id, query FROM sys_query_history a, stl_query b
WHERE a.query_id = <query_id>
AND a.transaction_id = b.xid
AND b.starttime BETWEEN a.start_time AND a.end_time
AND b.endtime BETWEEN a.start_time AND a.end_time;
注意:仅在领导节点上运行的查询存在于 SYS_QUERY_HISTORY 中,而 STL_QUERY 会排除这些查询。
在以下查询中,使用 STL/SVL 中的 query 获取 SYS 中的查询 ID:
SELECT query_id, query FROM sys_query_history a, stl_query b
WHERE b.query = <query>
AND a.transaction_id = b.xid
AND b.starttime BETWEEN a.start_time AND a.end_time
AND b.endtime BETWEEN a.start_time AND a.end_time;
查找相同 SQL 语句的查询历史记录
这些查询的输出有助于您比较不同的查询运行情况。要在 SYS_QUERY_HISTORY 中查找在不同时间运行的相同查询,请使用以下查询来检索 user_query_hash 值及其对应的条目:
SELECT user_query_hash FROM sys_query_history
WHERE query_id = <query_id>;
SELECT *
FROM sys_query_history
WHERE user_query_hash = '<user_query_hash>';
相关信息
查询计划和执行工作流程