在 Redshift 中调试查询时,查看
SVL_COMPILE
来查看查询在何处触发编译非常有用,如果您不小心这样做,这显然会消耗大量时间。然而,您在SVL_COMPILE
中得到的只是“段”和“轨迹”的一些想法。
有什么方法可以将这些数字映射到查询文本的实际部分吗?或者至少,如何推断它们可能指的是什么?例如,这些段似乎与查询的 EXPLAIN 中的节点数不匹配。
从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_REPORT和SVL_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中的节点数不匹配,从概述文档来看,段是计算节点可执行的最小编译单元。这意味着一个段只能由一个节点处理,但一个节点可以处理多个段,因此节点和段的数量有所不同。