Простое эквивалентное разделение между postgreSQL разделами занимает много времени (10 минут) - PullRequest
0 голосов
/ 22 марта 2020

Мы используем postgreSQL базу данных, и я нарушаю некоторые ограничения. У меня есть разделы в таблице company_sale_account, основанные на названии компании

. Мы создаем отчет по сопоставленным счетам между ними. Ниже приведен запрос:

SELECT cpsa1.*
FROM company_sale_account cpsa1  
 JOIN  company_sale_account cpsa2  ON cpsa1.sale_account_id = cpsa2.sale_account_id 
 WHERE  cpsa1.company_name = 'company_a'  
 AND cpsa2.company_name = 'company_b' 

Мы настроили индексы BTREE для столбца sale_account_id в обеих таблицах. До недавнего времени это работало нормально. Теперь у нас есть 10 миллионов строк в разделе company_a и 7 миллионов строк в разделе company_b. Этот запрос занимает более 10 минут.

Ниже приведен выход плана объяснения для него:

Buffers: shared hit=20125996 read=47811 dirtied=75, temp read=1333427 written=1333427   I/O Timings: read=19619.322 
   Sort  (cost=167950986.43..168904299.23 rows=381325118 width=132) (actual time=517017.334..603691.048 rows=16854094 loops=1) 
       Sort Key: cpsa1.crm_account_id, ((cpsa1.account_name)::text),((cpsa1.account_owner)::text), ((cpsa1.account_type)::text), cpsa1.is_customer, ((date_part('epoch'::text,cpsa1.created_date))::integer),((hstore_to_json(cpsa1.custom_crm_fields))::tex (...) 
        Sort Method: external merge  Disk: 2862656kB 
        Buffers: shared hit=20125996 read=47811 dirtied=75, temp read=1333427 written=1333427
        I/O Timings: read=19619.322 
        - Nested Loop (cost=0.00..9331268.39 rows=381325118 width=132) (actual time=1.680..118698.570 rows=16854094 loops=1) 
              Buffers: shared hit=20125977 read=47811 dirtied=75 
              I/O Timings: read=19619.322 
              - Append  (cost=0.00..100718.94 rows=2033676 width=33) (actual time=0.014..1783.243 rows=2033675 loops=1) 
                    Buffers: shared hit=75298 dirtied=75 
- Seq Scan on company_sale_account cpsa2  (cost=0.00..0.00 rows=1 width=516) (actual time=0.001..0.001 rows=0 loops=1) 
               Filter: ((company_name)::text = 'company_b'::text) 
                 - Seq Scan on company_sale_account_concur cpsa2_1  (cost=0.00..100718.94 rows=2033675 width=33) (actual time=0.013..938.145 rows=2033675 loops=1) 
                         Filter: ((company_name)::text = 'company_b'::text) 
                 Buffers: shared hit=75298 dirtied=75 
              - Append (cost=0.00..1.97 rows=23 width=355) (actual time=0.034..0.047 rows=8 loops=2033675) 
                    Buffers: shared hit=20050679 read=47811 
                    I/O Timings: read=19619.322 
       - Seq Scan on company_sale_account cpsa1  (cost=0.00..0.00 rows=1 width=4525) (actual time=0.000..0.000 rows=0 loops=2033675) 
        Filter: (((company_name)::text = 'company_a'::text) AND ((cpsa2.sale_account_id)::text = (sale_account_id)::text)) 
         - Index Scan using ix_csa_adp_sale_account on company_sale_account_adp cpsa1_1  (cost=0.56..1.97 rows=22 width=165) (actual time=0.033..0.042 rows=8 loops=2033675) 
                    Index Cond: ((sale_account_id)::text = (cpsa2.sale_account_id)::text)
                          Filter: ((company_name)::text = 'company_a'::text) 
                          Buffers: shared hit=20050679 read=47811 
                          I/O Timings: read=19619.322 
Planning time: 30.853 ms 
Execution time: 618218.321ms

У вас есть какие-либо предложения по настройке postgres. Пожалуйста, поделитесь своими мыслями. Это было бы мне очень полезно.

...