我注意到 Redshift 的查询优化器中有一些奇怪的行为,我想知道是否有人可以解释它或指出解决方法。
对于大型group by查询,让优化器计划 GroupAggregate 而不是 HashAggregate 是非常重要的,因此它不会尝试将临时结果放入内存中。一般来说,这对我来说很好用。但是当我尝试将其group by用作子查询时,它会切换到 HashAggregate。
例如,考虑以下查询。
select install_app_version, user_id, max(platform) as plat
from dailies
group by install_app_version, user_id;
Run Code Online (Sandbox Code Playgroud)
日常表有 sortkeys (install_app_version, user_id) 和 distkey (user_id)。因此 GroupAggregate 是可能的,并且查询计划看起来应该是这样的。
XN GroupAggregate (cost=0.00..184375.32 rows=1038735 width=51)
-> XN Seq Scan on daily_players (cost=0.00..103873.42 rows=10387342 width=51)
Run Code Online (Sandbox Code Playgroud)
相反,如果我在任何其他查询的子查询中使用上述内容,我会得到一个 HashAggregate。例如,即使是像这样简单的事情
select count(1) from
( select install_app_version, user_id, max(platform) as plat
from daily_players
group by install_app_version, user_id
);
Run Code Online (Sandbox Code Playgroud)
有查询计划
XN Aggregate (cost=168794.32..168794.32 rows=1 width=0)
-> XN Subquery Scan …Run Code Online (Sandbox Code Playgroud)