在分区表上追加成本非常高。

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

我有一个查询,连接两个以时间戳列为分区的表。两个表都是以当前日期分区过滤的。但查询异常缓慢,驱动表的APPEND成本非常高。

查询和计划 。https:/explain.dalibo.comanwVA

Nested Loop  (cost=0.56..174042.82 rows=16 width=494) (actual time=0.482..20.133 rows=1713 loops=1)
  Output: tran.transaction_status, mgwor.apx_transaction_id, org.organisation_name, mgwor.order_status, mgwor.request_date, mgwor.response_date, (date_part('epoch'::text, mgwor.response_date) - date_part('epoch'::text, mgwor.request_date))
  Buffers: shared hit=5787 dirtied=3
  ->  Nested Loop  (cost=0.42..166837.32 rows=16 width=337) (actual time=0.459..7.803 rows=1713 loops=1)
        Output: mgwor.apx_transaction_id, mgwor.order_status, mgwor.request_date, mgwor.response_date, org.organisation_name
        Join Filter: ((account.account_id)::text = (mgwor.account_id)::text)
        Rows Removed by Join Filter: 3007
        Buffers: shared hit=589
        ->  Nested Loop  (cost=0.27..40.66 rows=4 width=54) (actual time=0.203..0.483 rows=2 loops=1)
              Output: account.account_id, org.organisation_name
              Join Filter: ((account.organisation_id)::text = (org.organisation_id)::text)
              Rows Removed by Join Filter: 289
              Buffers: shared hit=27
              ->  Index Scan using account_pkey on mdm.account  (cost=0.27..32.55 rows=285 width=65) (actual time=0.013..0.122 rows=291 loops=1)
                    Output: account.account_id, account.account_created_at, account.account_name, account.account_status, account.account_valid_until, account.currency_id, account.organisation_id, account.organisation_psp_id, account."account_threeDS_required", account.account_use_webhook, account.account_webhook_url, account.account_webhook_max_attempt, account.reporting_account_id, account.card_type, account.country_id, account.product_id
                    Buffers: shared hit=24
              ->  Materialize  (cost=0.00..3.84 rows=1 width=55) (actual time=0.000..0.000 rows=1 loops=291)
                    Output: org.organisation_name, org.organisation_id
                    Buffers: shared hit=3
                    ->  Seq Scan on mdm.organisation_smd org  (cost=0.00..3.84 rows=1 width=55) (actual time=0.017..0.023 rows=1 loops=1)
                          Output: org.organisation_name, org.organisation_id
                          Filter: ((org.organisation_name)::text = 'ABC'::text)
                          Rows Removed by Filter: 67
                          Buffers: shared hit=3
        ->  Materialize  (cost=0.15..166576.15 rows=3835 width=473) (actual time=0.127..2.826 rows=2360 loops=2)
              Output: mgwor.apx_transaction_id, mgwor.order_status, mgwor.request_date, mgwor.response_date, mgwor.account_id
              Buffers: shared hit=562
              ->  Append  (cost=0.15..166556.97 rows=3835 width=473) (actual time=0.252..3.661 rows=2360 loops=1)
                    Buffers: shared hit=562
                    Subplans Removed: 1460
                    ->  Bitmap Heap Scan on public.mgworderrequest_part_20200612 mgwor  (cost=50.98..672.23 rows=2375 width=91) (actual time=0.251..2.726 rows=2360 loops=1)
                          Output: mgwor.apx_transaction_id, mgwor.order_status, mgwor.request_date, mgwor.response_date, mgwor.account_id
                          Recheck Cond: ((mgwor.request_type)::text = ANY ('{CARD,CARD_PAYMENT}'::text[]))
                          Filter: ((mgwor.request_date >= date(now())) AND (mgwor.request_date < (date(now()) + 1)))
                          Heap Blocks: exact=549
                          Buffers: shared hit=562
                          ->  Bitmap Index Scan on mgworderrequest_part_20200612_request_type_idx  (cost=0.00..50.38 rows=2375 width=0) (actual time=0.191..0.192 rows=2361 loops=1)
                                Index Cond: ((mgwor.request_type)::text = ANY ('{CARD,CARD_PAYMENT}'::text[]))
                                Buffers: shared hit=13
  ->  Append  (cost=0.14..435.73 rows=1461 width=316) (actual time=0.005..0.006 rows=1 loops=1713)
        Buffers: shared hit=5198 dirtied=3
        Subplans Removed: 1460
        ->  Index Scan using transaction_part_20200612_pkey on public.transaction_part_20200612 tran  (cost=0.29..0.87 rows=1 width=42) (actual time=0.004..0.005 rows=1 loops=1713)
              Output: tran.transaction_status, tran.transaction_id
              Index Cond: (((tran.transaction_id)::text = (mgwor.apx_transaction_id)::text) AND (tran.transaction_created_at >= date(now())) AND (tran.transaction_created_at < (date(now()) + 1)))
              Filter: (tran.transaction_status IS NOT NULL)
              Buffers: shared hit=5198 dirtied=3
Planning Time: 19535.308 ms
Execution Time: 21.006 ms

分区修剪在两张表上都有效。

我是不是漏掉了什么明显的东西?

谢谢,VA

postgresql postgresql-performance postgresql-11
1个回答
0
投票

我不知道为什么append的成本估计这么大,但估计你真正担心的是这个需要多长时间,而不是估计有多大。 如前所述,实际时间是去规划,而不是去执行。

一个可能的解释是,这是在等一把锁。 在分区表(但不是父表)的表锁上等待的时间会被归入规划时间。

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