我运行了这个:
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)
这个查询计划是什么意思?
查询计划是PostgreSQL计划器(Amazon Redshift基于PostgreSQL)为您的SQL语句生成的执行计划。
第一个节点是数据上的窗口聚合(WindowAgg),因为您正在使用OVER
窗口函数来计算行号。
第二个节点是对user_profile
表的顺序扫描(Seq-scan),因为您在不进行任何筛选的情况下对该表执行完整的select
。
顺序扫描扫描存储在磁盘上的整个表,因为您的查询需要对表进行完全遍历。即使在CCD_ 4&birth_date
,查询引擎几乎总是在这里进行序列扫描,因为您需要所有东西(取决于PostgreSQL中的random_page_cost
和enable_seqscan
参数)。
cost
数字实际上是任意的,但通常表示磁盘页面获取的数量;它被分成两个值,其中分隔符是CCD_ 9。
第一个值显示启动成本——这是返回第一行的估计成本。第二个值显示总成本——这是返回所有行的估计成本。
例如,对于序列扫描,启动成本为0,总成本估计为133369906.76
对于顺序扫描,启动成本通常为0。除了返回数据之外,没有什么真正的事情可做,这样它就可以立即开始返回数据。节点的总成本也包括其所有子节点的成本——在这种情况下,两个操作的最终总成本看起来是133833424.40
,它是扫描和聚合成本的总和。
rows
值表示将返回的估计行数。在这种情况下,两个操作都具有相同的值,因为聚合将应用于所有行&没有执行将减少最终行的数量的过滤。
width
值表示每一返回行的估计大小(以字节为单位),即每一行在聚合之前的长度很可能为28字节,而在聚合之后的长度则为36字节。
把这些放在一起,你可以这样阅读查询计划:
- 对表user_profile进行顺序扫描
- 很可能会立即开始返回行
- 估计磁盘页面获取计数为133369906.76
- 估计将返回30901176行
- 估计总行大小为28字节
- 对来自上述操作的数据进行窗口聚合
- 很可能会立即开始返回行
- 估计磁盘页面获取计数为133833424.40
- 估计将返回30901176行
- 估计总行大小为36字节