PostgreSQL解释:为什么孩子的成本高于父母?

时间:2015-03-24 23:18:16

标签: sql postgresql query-optimization

为什么某些较低规划的节点的成本高于最高节点的成本?在this article中,我找到了这个例子

EXPLAIN SELECT *
FROM tenk1 t1, onek t2
WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2;

                                        QUERY PLAN
------------------------------------------------------------------------------------------
 Merge Join  (cost=198.11..268.19 rows=10 width=488)
   Merge Cond: (t1.unique2 = t2.unique2)
   ->  Index Scan using tenk1_unique2 on tenk1 t1  (cost=0.29..656.28 rows=101 width=244)
         Filter: (unique1 < 100)
   ->  Sort  (cost=197.83..200.33 rows=1000 width=244)
         Sort Key: t2.unique2
         ->  Seq Scan on onek t2  (cost=0.00..148.00 rows=1000 width=244)

子节点索引扫描的成本比合并连接节点的成本更高。在文章中它还说“重要的是要理解上层节点的成本包括其所有子节点的成本”。

那么为什么孩子的成本要高于其父母?

1 个答案:

答案 0 :(得分:1)

如您所见,成本确实包括所有儿童费用:) 并且子索引的行可能比您在查询中加入的结果更多。因此,如果tenk1_unique2是unique2上的复合唯一键,并且是其他值,并且是此连接的最便宜的索引,则它可以容纳101行,其中包含一个unique2值...这样,您可以比较101并且在结果中有1行。 ..

<强> UPDATE1 父母的成本是儿童成本的总和。但是连接中的子项的行数更大。但如果你加1对101,你得到1的结果。所以父母可以有1行,而孩子有100行...

Update2 我猜想是

  

上级节点的成本包括其所有子节点的成本

仅对

有效
  

预计启动费用

<强> UPDATE3

我的同事说,在应用过滤器之前估计总费用(656.28)......