explain analyse
SELECT COUNT(*) FROM syo_event WHERE id_group = 'OPPORTUNITY' AND id_type = 'NEW'
我的问题是这样的:
Aggregate (cost=654.16..654.17 rows=1 width=0) (actual time=3.783..3.783 rows=1 loops=1)
-> Bitmap Heap Scan on syo_event (cost=428.76..654.01 rows=58 width=0) (actual time=2.774..3.686 rows=1703 loops=1)
Recheck Cond: ((id_group = 'OPPORTUNITY'::text) AND (id_type = 'NEW'::text))
-> BitmapAnd (cost=428.76..428.76 rows=58 width=0) (actual time=2.635..2.635 rows=0 loops=1)
-> Bitmap Index Scan on syo_list_group (cost=0.00..35.03 rows=1429 width=0) (actual time=0.261..0.261 rows=2187 loops=1)
Index Cond: (id_group = 'OPPORTUNITY'::text)
-> Bitmap Index Scan on syo_list_type (cost=0.00..393.45 rows=17752 width=0) (actual time=2.177..2.177 rows=17555 loops=1)
Index Cond: (id_type = 'NEW'::text)
Total runtime: 3.827 ms
在第一行:
(actual time=3.783..3.783 rows=1 loops=1
(为什么实际时间与最后一行不匹配,
Total runtime
?)在第二行:
cost=428.76..654.01
(以成本428.76开始
Bitmap Heap Scan
,以654.01结束)?rows=58 width=0)
(Wath是
rows
和width
,有什么重要的吗?)rows=1703
(这就是结果)
loops=1)
(用于子查询?)
最佳答案
至于第一行,EXPLAIN
执行了查询,它花费了3.783 ms
,但是向您展示计划的输出需要一些时间,因此总运行时间会随着花在这方面的时间而增加。
基本上EXPLAIN ANALYZE
显示的是一个普通的EXPLAIN
将显示从实际运行查询中收集的值,因此第二行中的差异。
行和宽度都很重要。这分别是输出估计的行数和以字节为单位的行的平均宽度。如果返回的行的估计值较小,并且需要考虑到这一点,则估计的总成本将更低。
要了解循环实际呈现的内容,需要知道查询计划实际上是计划节点树。有不同类型的节点用于不同的目的—例如,扫描节点负责从表返回原始行。如果查询正在对行执行某些操作,则扫描节点上方将有其他节点来处理该操作。EXPLAIN
输出的第一行是来自级别1(顶部)节点的摘要,其中包含整个计划的估计成本。
知道了这一点,循环表示特定节点的执行总数的值。这是因为在某些计划中,子计划节点可以执行多次,如果发生这种情况,那么为了使数字与其他估计值相比较,它将时间和行值乘以循环,以获得在该节点中花费的总时间。
您可以在documentation中获得有关该主题的更多信息。
关于sql - 了解Postgres查询计划,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39517147/