如何在redshift中加入sys_query_history和stl_querytext

问题描述 投票:0回答:3
我需要从 sys_query_history 执行的查询的一些信息 喜欢 状态、result_cache_hit、开始时间、结束时间、错误消息

并从 stl_querytext 获取全文

如何连接这 2 个表,因为这 2 个表中的 queryid 不同

我正在使用 sys_query_history.transaction_id= stl_querytext.xid 和 sys_query_history.session_id= stl_querytext.pid

但它不起作用,因为用户可以在同一会话中执行超过 1 个查询 在这种情况下,sys_query_history 中的 query_id 与 stl_querytext 中的查询不同

amazon-redshift
3个回答
3
投票
SYS 系统视图是新的日志记录方法。您无法连接 STL 和 SYS 表视图。与 STL 表相比,Redshift 在 SYS 视图中以不同方式记录数据(使用 diff queryid)。 STL和SYS表不能组合使用。


0
投票
我不确定“这两个表中的 queryid 不同”是什么意思。 sys_query_history 和 stl_querytext 都将查询 id 作为列(分别为 query_id 和 query)。

你应该添加-

AND sys_query_history.query_id= stl_querytext.query
您的 JOIN ON 子句。


0
投票
所以问题的关键在于,在 Redshift 中,用户/父查询被 Redshift 优化器转换为一个或多个重写/子查询。原始用户查询在 SYS 表视图中记录为单行。内部重写的查询被赋予单独的查询 ID 并记录在 STL 表视图中。对于更简单的查询,这可以是一对一映射,但通常您会发现每个父查询有多个子查询。

交易 ID 是关联两者的正确方法。这就是

Redshift 文档中演示的内容。

如果您对历史关联 SYS/STL 表不感兴趣,您可以调用

last_user_query_id()

pg_last_query_id()
 分别获取最新的父查询 id 和子查询 id。这不会捕获一对多关系,因为您只是获取最后重写查询的 id。对于 COPY/加载查询,您还可以使用 
pg_last_copy_id()
,它可以让您将上次执行的 COPY 与其父用户查询相关联。

由于它是一对多的,所以实际上没有单一的方法来连接表。最有可能的是,您可能希望在加入 SYS 之前聚合 STL 中的所有行。或者您可能想要挑选并找到子项的单个 STL 查询。某些表仅包含某些查询类型的条目,因此在加入之前可能不需要聚合/选择(例如 STL_LOAD_ERRORS 和 SYS_LOAD_ERROR_DETAIL)

© www.soinside.com 2019 - 2024. All rights reserved.