了解Postgres解释计划

问题描述 投票:0回答:1

我想通过这个网站了解一个Postgres解释计划(http:/explain.depesz.com).

这是我的计划。

Unique  (cost=795.43..800.89 rows=546 width=23) (actual time=0.599..0.755 rows=620 loops=1)
  ->  Sort  (cost=795.43..796.79 rows=546 width=23) (actual time=0.598..0.626 rows=620 loops=1)
        Sort Key: m.member_id, c.total_charged_amt DESC, c.claim_status
        Sort Method: quicksort  Memory: 73kB
        ->  Nested Loop  (cost=9.64..770.60 rows=546 width=23) (actual time=0.023..0.342 rows=620 loops=1)
              ->  Bitmap Heap Scan on member m  (cost=9.22..222.50 rows=63 width=8) (actual time=0.016..0.024 rows=62 loops=1)
                    Recheck Cond: (((member_id >= 1584161838) AND (member_id <= 1584161898)) OR (member_birth_dt = '1978-03-13'::date))
                    Heap Blocks: exact=3
                    ->  BitmapOr  (cost=9.22..9.22 rows=63 width=0) (actual time=0.013..0.013 rows=0 loops=1)
                          ->  Bitmap Index Scan on member_pkey  (cost=0.00..4.31 rows=2 width=0) (actual time=0.007..0.007 rows=61 loops=1)
                                Index Cond: ((member_id >= 1584161838) AND (member_id <= 1584161898))
                          ->  Bitmap Index Scan on idx_dob  (cost=0.00..4.88 rows=61 width=0) (actual time=0.006..0.006 rows=1 loops=1)
                                Index Cond: (member_birth_dt = '1978-03-13'::date)
              ->  Index Scan using idx_memberid on claim c  (cost=0.42..8.60 rows=10 width=23) (actual time=0.001..0.003 rows=10 loops=62)
                    Index Cond: (member_id = m.member_id)
Planning Time: 0.218 ms
Execution Time: 0.812 ms

这个计划也可以在下面的链接中找到。https:/explain.depesz.comsQzau。.

我有以下问题。

  1. Bitmap Index Scans 由于压痕的原因,分别在0. 007s和0. 006s内并行运行。

    那么为什么 Bitmapor 从0.013s开始?为什么它要把两个子代的时间都加进去?的开始时间是0.013s?Bitmapor 应该是其2个孩子的最大值。所以理想的情况是 专属时间Bitmapor 应该是0.006(0.013-0.007),但它是0(0.013-0.007-0.006)。

  2. Bitmap Heap Scanindex scan 属于 Nested Loop 并分别在0.024s和0.186s内运行。

    由于缩进的原因,我假设这2个子程序是并行运行的。所以父代 专属时间 应该是0.156(0.342-0.186),但它是0.132(0.342-0.186-0.24)。

我的理解是,我们应该减去最大的子时序(因为它们是并行运行的),以获得在节点上花费的专属时间。但是,它是把子节点的时间加起来,然后从父节点的结束时间中减去总和,从而得到独占时间。我对解释计划的理解有误吗?

任何帮助是真的很感激,因为我完全困惑与解释他们。

postgresql sql-execution-plan explain
1个回答
1
投票

正如马哥所说,不涉及并行处理。如果涉及到并行查询,你会看到的是 Gather 节点,收集结果。

压痕可视化了查询执行计划的图。

                         Unique
                           |
                          Sort
                           |
                      Nested Loop
                        /      \
          Bitmap Heap Scan    Index Scan
                  |
              Bitmap Or
               /     \
Bitmap Index Scan   Bitmap Index Scan

这就解释了为什么explain.depesz.com会以这种方式计算专属时间。请注意,这只是一个最好的努力,而不是绝对的事实,因为(例如)"位图或 "不需要零时间。但explain.depesz.com只能根据它从以下地方得到的数字来计算 EXPLAIN.

© www.soinside.com 2019 - 2024. All rights reserved.