Redshift查询:该EXPLAIN执行计划输出的含义是什么?
该PostgreSQL查询计划的含义解析
你执行的SQL语句:
EXPLAIN select id, birth_date, ROW_NUMBER() OVER (ORDER BY 1) AS load_id from user_profile;
得到的查询计划输出:
WindowAgg (cost=0.00..133833424.40 rows=30901176 width=36) -> Seq Scan on user_profile (cost=0.00..133369906.76 rows=30901176 width=28)
下面是逐部分的含义解析:
1. 底层操作:全表顺序扫描(Seq Scan)
Seq Scan on user_profile:数据库会对user_profile表执行全表顺序扫描,也就是从头到尾逐行读取表内所有数据,未使用索引加速。cost=0.00..133369906.76:这是数据库估算的执行开销,0.00是启动成本(开始返回数据前的准备开销),133369906.76是完成整个扫描的总成本。rows=30901176:数据库估算该表共有30901176行数据,扫描会读取全部行。width=28:每行返回的id和birth_date两个字段的平均总字节数为28。
2. 上层操作:窗口聚合(WindowAgg)
WindowAgg:这是执行窗口函数ROW_NUMBER() OVER (ORDER BY 1)的环节。这里的ORDER BY 1表示按查询结果的第一列(即id)排序,但由于所有行的排序逻辑无实际区分度(可理解为按常量排序),最终ROW_NUMBER()会按照全表扫描的顺序,给每行分配一个唯一的递增序号作为load_id。cost=0.00..133833424.40:窗口聚合的总成本,等于底层全表扫描的成本加上计算行号的额外开销(两者差值约46万,就是生成load_id的开销)。rows=30901176:窗口函数不会过滤或新增行,所以输出行数和底层扫描的行数一致。width=36:输出每行的平均总字节数为36,比底层的28多了8字节,对应新增的load_id字段(一般为bigint类型,占8字节)。
内容的提问来源于stack exchange,提问作者Jwan622
相关产品推荐
相关产品推荐

