PostgreSQL确切解释了什么?

时间:2020-03-06 14:33:43  来源:igfitidea点击:

MySQL的说明输出非常简单。 PostgreSQL有点复杂。我也找不到能够解释它的好资源。

我们能否描述确切解释的内容,或者至少将我指向好的资源的方向?

解决方案

它从最大缩进到最小缩进执行,我相信从计划的底部到顶部。 (因此,如果有两个缩进部分,则首先执行页面缩进部分,然后当它们遇到另一部分时执行,然后执行连接它们的规则。)

这个想法是,在每个步骤中,都会有1或者2个数据集到达并通过某些规则进行处理。如果只是一个数据集,则对该数据集执行该操作。 (例如,扫描索引以找出所需的行,过滤数据集或者对其进行排序。)如果是两个,则这两个数据集是缩进的两件事,并且按照我们看到的规则将它们结合在一起。可以很容易地猜出大多数规则的含义(特别是如果我们之前阅读过很多解释计划的话),但是我们可以尝试通过查看文档或者(更轻松地)通过将短语放入Google以及一些关键字,例如" EXPLAIN"。

显然,这不是一个完整的解释,但是它提供了足够的上下文,我们通常可以确定所需的内容。例如,从实际数据库中考虑此计划:

explain analyze
select a.attributeid, a.attributevalue, b.productid
from orderitemattribute a, orderitem b
where a.orderid = b.orderid
and a.attributeid = 'display-album'
and b.productid = 'ModernBook';

------------------------------------------------------------------------------------------------------------------------------------------------------------

 Merge Join  (cost=125379.14..125775.12 rows=3311 width=29) (actual time=841.478..841.478 rows=0 loops=1)
   Merge Cond: (a.orderid = b.orderid)
   ->  Sort  (cost=109737.32..109881.89 rows=57828 width=23) (actual time=736.163..774.475 rows=16815 loops=1)
         Sort Key: a.orderid
         Sort Method:  quicksort  Memory: 1695kB
         ->  Bitmap Heap Scan on orderitemattribute a  (cost=1286.88..105163.27 rows=57828 width=23) (actual time=41.536..612.731 rows=16815 loops=1)
               Recheck Cond: ((attributeid)::text = 'display-album'::text)
               ->  Bitmap Index Scan on (cost=0.00..1272.43 rows=57828 width=0) (actual time=25.033..25.033 rows=16815 loops=1)
                     Index Cond: ((attributeid)::text = 'display-album'::text)
   ->  Sort  (cost=15641.81..15678.73 rows=14769 width=14) (actual time=14.471..16.898 rows=1109 loops=1)
         Sort Key: b.orderid
         Sort Method:  quicksort  Memory: 76kB
         ->  Bitmap Heap Scan on orderitem b  (cost=310.96..14619.03 rows=14769 width=14) (actual time=1.865..8.480 rows=1114 loops=1)
               Recheck Cond: ((productid)::text = 'ModernBook'::text)
               ->  Bitmap Index Scan on id_orderitem_productid  (cost=0.00..307.27 rows=14769 width=0) (actual time=1.431..1.431 rows=1114 loops=1)
                     Index Cond: ((productid)::text = 'ModernBook'::text)
 Total runtime: 842.134 ms
(17 rows)

尝试自己动手阅读,看看是否有意义。

我读到的是,数据库首先扫描id_orderitem_productid索引,使用该索引从orderitem中查找所需的行,然后使用快速排序对数据集进行排序(如果数据不适合RAM,则使用的排序将发生变化) ,然后将其放在一旁。

接下来,它扫描" orditematt_attributeid_idx"以从" orderitemattribute"中查找所需的行,然后使用快速排序对该数据集进行排序。

然后,它将两个数据集合并。 (合并联接是一种"压缩"操作,它使两个排序后的数据集并行移动,并在它们匹配时发出联接的行。)

就像我说的那样,我们要遍历计划的内部到外部,从下到上。

Explaining_EXPLAIN.pdf也可以提供帮助。

PgAdmin将为我们显示解释计划的图形表示。在两者之间来回切换确实可以理解文本表示的含义。但是,如果我们只想知道它要做什么,则可以始终使用GUI。

还有一个在线帮助工具Depesz,它将突出显示分析结果中昂贵的部分。

也有一个,这里是相同的结果,对我来说,这更清楚了问题出在哪里。

如果安装了pgadmin,则有一个"解释"按钮,该按钮还为文本输出提供了所发生情况的图表,并显示了过滤器,排序和子集合并,这些对于我发现所发生的事情非常有用。