将查询段和轨迹从 SVL_COMPILE 映射到实际查询文本

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

在 Redshift 中调试查询时,查看

SVL_COMPILE
来查看查询在何处触发编译非常有用,如果您不小心这样做,这显然会消耗大量时间。然而,您在
SVL_COMPILE
中得到的只是“”和“轨迹”的一些想法。

有什么方法可以将这些数字映射到查询文本的实际部分吗?或者至少,如何推断它们可能指的是什么?例如,这些段似乎与查询的 EXPLAIN 中的节点数不匹配。

amazon-web-services amazon-redshift
1个回答
0
投票

EXPLAIN的文档中,看起来像

EXPLAIN
查询的返回结果

XN Merge  (cost=1002815366604.92..1002815366606.36 rows=576 width=27)
  Merge Key: sum(sales.pricepaid)
  ->  XN Network  (cost=1002815366604.92..1002815366606.36 rows=576 width=27)
        Send to leader
        ->  XN Sort  (cost=1002815366604.92..1002815366606.36 rows=576 width=27)
              Sort Key: sum(sales.pricepaid)
              ->  XN HashAggregate  (cost=2815366577.07..2815366578.51 rows=576 width=27)
                    ->  XN Hash Join DS_BCAST_INNER  (cost=109.98..2815365714.80 rows=172456 width=27)
                          Hash Cond: ("outer".eventid = "inner".eventid)
                          ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=14)
                          ->  XN Hash  (cost=87.98..87.98 rows=8798 width=21)
                                ->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=21)

带有

->  XN 
前缀的每一行代表
EXPLAIN
操作的单个步骤。大多数步骤除了其运算符之外还提供上下文,例如
XN Sort
运算符提供排序键,以便您可以将其映射到查询的
order by
部分。但是,某些步骤可能不会链接到查询的任何部分,例如
XN Network
,它仅将结果发送到领导节点以进行进一步处理。您可以在此处了解有关 EXPLAIN 运算符的更多信息。

SVL_COMPILE
返回的单个段可以包含输出中提到的多个
EXPLAIN
操作。由于其并行性质,操作如何在段之间划分是不确定的,因此您只能在执行查询后才能知道。执行查询后,其结果记录在SVL_QUERY_REPORTSVL_QUERY_SUMMARY中。可以使用query打印出查询的性能报告

select * from svl_query_report where query = <your query ID> order by segment, step, elapsed_time, rows;

select * from svl_query_summary where query = <your query ID> order by stm, seg, step;

这将输出包含查询信息的表。我们需要的信息是段 id(

seg
segment
列)、步骤 id(
step
列)和步骤标签(
label
列)。根据有关文档,
EXPLAIN
输出步骤是从下往上执行的,这意味着段id和步骤id也在0索引中从下往上索引。另请注意,步骤 id 索引包含在单个段中,因此当移动到新段时,步骤 id 会重置为 0。例如,给定上述示例
EXPLAIN
输出和 文档中的 diagram 进行解释 ,每个
XN
操作的索引如下所示

segment=5;step=0 XN Merge  (cost=1002815366604.92..1002815366606.36 rows=576 width=27)
  Merge Key: sum(sales.pricepaid)
segment=4;step=0  ->  XN Network  (cost=1002815366604.92..1002815366606.36 rows=576 width=27)
        Send to leader
segment=3;step=1        ->  XN Sort  (cost=1002815366604.92..1002815366606.36 rows=576 width=27)
                               Sort Key: sum(sales.pricepaid)
segment=2;step=2|segment=3;step=0              ->  XN HashAggregate  (cost=2815366577.07..2815366578.51 rows=576 width=27)
segment=2;step=2                    ->  XN Hash Join DS_BCAST_INNER  (cost=109.98..2815365714.80 rows=172456 width=27)
segment=2;step=1                          Hash Cond: ("outer".eventid = "inner".eventid)
segment=2;step=0                          ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=14)
segment=1;step=0                          ->  XN Hash  (cost=87.98..87.98 rows=8798 width=21)
segment=0;step=0                                ->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=21)

要获取步骤 ID 实际

EXPLAIN
操作的更多上下文,您可以在
label
列中阅读其标签。每个标签列都可以映射到特定的操作。您可以在这里查看完整的地图表

通过将每个段追溯到每个

EXPLAIN
步骤,您可以在桌子
SVL_QUERY_REPORT
SVL_QUERY_SUMMARY
上阅读他们的表现。您可以查看这里这里了解更多详情

关于为什么段数与EXPLAIN中的节点数不匹配,从概述文档来看,段是计算节点可执行的最小编译单元。这意味着一个段只能由一个节点处理,但一个节点可以处理多个段,因此节点和段的数量有所不同。

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