我有一个Redshift查询,它生成以下查询计划:
XN HashAggregate (cost=4.00..4.06 rows=1 width=213)
-> XN Hash Join DS_DIST_ALL_NONE (cost=0.02..3.97 rows=1 width=213)
-> XN Hash Join DS_DIST_NONE (cost=0.00..3.93 rows=1 width=213)
-> XN Hash (cost=0.01..0.01 rows=1 width=8)
-> XN Seq Scan on response_entities re (cost=0.00..1.96 rows=157 width=85)
-> XN Hash (cost=0.00..0.00 rows=1 width=208)
-> XN Seq Scan on response_views rv (cost=0.00..0.00 rows=1 width=208)
-> XN Seq Scan on dim_date dd (cost=0.00..0.01 rows=1 width=8)
该查询不会广播或重新分发任何数据,它的成本非常低,并且不需要读取大量行。它实际上不返回任何行,并且其任何步骤都不基于磁盘。
AWS控制台上的执行详细信息显示如下:
我不包括查询,因为我没有寻找该特定查询需要3秒钟才能完成的原因。我一直看到执行时间表与此类似,我试图理解为什么即使每个步骤仅花费几毫秒即可完成,查询却要花费更长的时间。没有其他并发查询正在执行。
所有这些时间都花在查询编译上吗?这是预期的吗?有什么我想念的吗?
答案 0 :(得分:1)
查询编译似乎是这样做的原因。此查询慢速编译的段。
select userid, xid, pid, query, segment, locus,
datediff(ms, starttime, endtime) as duration, compile
from svl_compile
where query = 26540
order by query, segment;
有关svl_compile的更多信息,请参见here。
this article解释了相同的问题,以及如何减少编译次数(或解决方法)。