Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос в котором группируется большое кол-во данных / 5 сообщений из 5, страница 1 из 1
27.09.2021, 10:58
    #40100152
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос в котором группируется большое кол-во данных
Иcпользую СУБД PostgreSQL

Запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
  WITH         
		ar AS(
		    SELECT *
		    FROM "ActualDocuments"
		    WHERE 
			"Account" = ANY('{3344433}'::bigint[]) AND
			"MinimalDate" < '2021-09-20'::date 			 
		),      
        user_null AS(
            SELECT
                   DISTINCT
                pp."Account" AS "Account",
                pp."User" AS "Responsible",
                pp."Event" AS "Event",
                array_agg(DISTINCT pp."Subscriber") AS "Subscriber",
                MIN(pp."EndDate") AS "MinimalDate"
            FROM "Documents" pp           
                INNER JOIN ar ON (
			        pp."Account" = ar."Account" AND
				    pp."Event" = ar."Event"
			    )          
            WHERE               
                pp."User" IS NULL                
            GROUP BY pp."Account", pp."User", pp."Event"
        ),
        user_not_null AS(
            SELECT DISTINCT
                pp."Account" AS "Account",
                pp."User" AS "Responsible",
                pp."Event" AS "Event",
                array_agg(DISTINCT pp."Subscriber") AS "Subscriber",
                MIN(pp."EndDate") AS "MinimalDate"
            FROM "Documents" pp         
                INNER JOIN ar ON (
			        pp."Account" = ar."Account" AND
				    pp."Event" = ar."Event"
			    )
            WHERE                
                pp."User" IS NOT NULL                
            GROUP BY pp."Account", pp."User", pp."Event"
        )
		SELECT *
		FROM user_not_null 
		UNION
		SELECT *
		FROM user_null



План:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
"HashAggregate  (cost=29881.28..29915.65 rows=3437 width=64) (actual time=4117.404..4151.053 rows=107270 loops=1)"
"  Group Key: user_not_null."Account", user_not_null."Responsible", user_not_null."Event", user_not_null."Subscriber", user_not_null."MinimalDate""
"  Buffers: shared hit=735944 dirtied=3, temp read=6722 written=8057"
"  CTE ar"
"    ->  Bitmap Heap Scan on "ActualDocuments"  (cost=36.30..1993.75 rows=465 width=73) (actual time=0.216..1.173 rows=120 loops=1)"
"          Recheck Cond: (("Account" = ANY ('{3344433}'::bigint[])) AND ("MinimalDate" IS NOT NULL))"
"          Filter: ("MinimalDate" < '2021-09-20'::date)"
"          Rows Removed by Filter: 119"
"          Heap Blocks: exact=277"
"          Buffers: shared hit=286"
"          ->  Bitmap Index Scan on "iMinimalDate"  (cost=0.00..36.18 rows=519 width=0) (actual time=0.171..0.172 rows=883 loops=1)"
"                Index Cond: ("Account" = ANY ('{3344433}'::bigint[]))"
"                Buffers: shared hit=9"
"  CTE user_null"
"    ->  HashAggregate  (cost=13603.55..13633.30 rows=2975 width=64) (actual time=1718.383..1718.436 rows=68 loops=1)"
"          Group Key: pp."Account", pp."User", pp."Event", array_agg(DISTINCT pp."Subscriber"), min(pp."EndDate")"
"          Buffers: shared hit=308557 dirtied=3, temp read=3060 written=3080"
"          ->  GroupAggregate  (cost=13484.55..13566.36 rows=2975 width=64) (actual time=710.150..1714.046 rows=68 loops=1)"
"                Group Key: pp."Account", pp."User", pp."Event""
"                Buffers: shared hit=308557 dirtied=3, temp read=3060 written=3080"
"                ->  Sort  (cost=13484.55..13491.99 rows=2975 width=37) (actual time=701.077..778.699 rows=343548 loops=1)"
"                      Sort Key: pp."Account", pp."User", pp."Event""
"                      Sort Method: external merge  Disk: 11032kB"
"                      Buffers: shared hit=308557 dirtied=3, temp read=3060 written=3080"
"                      ->  Nested Loop  (cost=0.56..13312.91 rows=2975 width=37) (actual time=0.037..418.331 rows=343548 loops=1)"
"                            Buffers: shared hit=308557 dirtied=3"
"                            ->  CTE Scan on ar  (cost=0.00..9.30 rows=465 width=12) (actual time=0.001..0.143 rows=120 loops=1)"
"                            ->  Index Scan using "iUserNull" on "Documents" pp  (cost=0.56..28.55 rows=6 width=37) (actual time=0.012..3.119 rows=2863 loops=120)"
"                                  Index Cond: (("Account" = ar."Account") AND ("Event" = ar."Event"))"
"                                  Buffers: shared hit=308557 dirtied=3"
"  CTE user_not_null"
"    ->  Unique  (cost=14101.23..14108.16 rows=462 width=64) (actual time=2247.025..2294.759 rows=107202 loops=1)"
"          Buffers: shared hit=427387, temp read=3662 written=3677"
"          ->  Sort  (cost=14101.23..14102.38 rows=462 width=64) (actual time=2247.023..2260.200 rows=107202 loops=1)"
"                Sort Key: pp_1."Account", pp_1."User", pp_1."Event", (array_agg(DISTINCT pp_1."Subscriber")), (min(pp_1."EndDate"))"
"                Sort Method: external sort  Disk: 8032kB"
"                Buffers: shared hit=427387, temp read=3662 written=3677"
"                ->  GroupAggregate  (cost=14068.07..14080.78 rows=462 width=64) (actual time=1712.571..2077.099 rows=107202 loops=1)"
"                      Group Key: pp_1."Account", pp_1."User", pp_1."Event""
"                      Buffers: shared hit=427387, temp read=2658 written=2673"
"                      ->  Sort  (cost=14068.07..14069.23 rows=462 width=37) (actual time=1712.535..1783.618 rows=237252 loops=1)"
"                            Sort Key: pp_1."Account", pp_1."User", pp_1."Event""
"                            Sort Method: external merge  Disk: 11200kB"
"                            Buffers: shared hit=427387, temp read=2658 written=2673"
"                            ->  Nested Loop  (cost=0.56..14047.62 rows=462 width=37) (actual time=0.258..1412.308 rows=237252 loops=1)"
"                                  Buffers: shared hit=427387"
"                                  ->  CTE Scan on ar ar_1  (cost=0.00..9.30 rows=465 width=12) (actual time=0.218..1.511 rows=120 loops=1)"
"                                        Buffers: shared hit=286"
"                                  ->  Index Scan using "iUser" on "Documents" pp_1  (cost=0.56..30.18 rows=1 width=37) (actual time=0.235..11.441 rows=1977 loops=120)"
"                                        Index Cond: (("Account" = ar_1."Account") AND ("Event" = ar_1."Event"))"
"                                        Buffers: shared hit=427101"
"  ->  Append  (cost=0.00..103.11 rows=3437 width=64) (actual time=2247.028..4050.176 rows=107270 loops=1)"
"        Buffers: shared hit=735944 dirtied=3, temp read=6722 written=8057"
"        ->  CTE Scan on user_not_null  (cost=0.00..9.24 rows=462 width=64) (actual time=2247.027..2320.721 rows=107202 loops=1)"
"              Buffers: shared hit=427387, temp read=3662 written=4678"
"        ->  CTE Scan on user_null  (cost=0.00..59.50 rows=2975 width=64) (actual time=1718.393..1721.813 rows=68 loops=1)"
"              Buffers: shared hit=308557 dirtied=3, temp read=3060 written=3379"
"Planning time: 0.961 ms"
"Execution time: 4164.426 ms"





Для некоторых аккаунтов получается большое количество
записей, которые нужно сгруппировать, из-за этого
запрос долго выполняется по времени и shared hit memory, у меня идей не осталось.
...
Рейтинг: 0 / 0
27.09.2021, 12:41
    #40100178
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос в котором группируется большое кол-во данных
polin11,

1)так вполне логично что чем больше записей обрабатывается тем дольше запрос.

2)обьясните смысл использования distinct в 2х местах... он там помоему ну совсем не нужен а время тратит

3)как видно запрос начинает временные файлы писать а это его сильно замедляет
рекомендую поднять work_mem до уровня чтобы временных файлов не было (в вашем случае я думаю 32MB или 64MB должно хватать)

4)зачем вы 2 раза тяжелый join делаете?
вам надо 1 раз сделать его а делить на user_null/user_not_null уже потом

5)зачем вы используете union там где по смыслу очевидно union all надо? откуда у вас там дубликаты в конце могут быть.

6)зачем у вас join там где exists скорее всего требуется?

7)зачем у вас фильтр по "Account" делается через with/ar вместо прямого указания pp."Account" = ANY('{3344433}'::bigint[]) ?

В общем что то вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
set work_mem to '64MB';

explain (analyze,costs,buffers,timing)
WITH         
        user AS (
            SELECT
                 pp."Account" AS "Account",
                pp."User" AS "Responsible",
                pp."Event" AS "Event",
                array_agg(DISTINCT pp."Subscriber") AS "Subscriber",
                MIN(pp."EndDate") AS "MinimalDate"
            FROM "Documents" pp           
            WHERE
            EXISTS (
               SELECT FROM "ActualDocuments" ar WHERE      
               ar."MinimalDate" < '2021-09-20'::date
               AND ar."Account"=pp."Account"
               AND ar."Event"=pp."Event"
            )
            AND pp."Account" = ANY('{3344433}'::bigint[])
            GROUP BY pp."Account", pp."User", pp."Event"
        )
		SELECT *
		FROM user WHERE "Responsible" IS NOT NULL
		UNION ALL
		SELECT *
		FROM user WHERE "Responsible" IS NULL



Вот как то так попробуйте... и покажите план... может ещё надо будет индекс добавить.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
29.09.2021, 12:20
    #40100639
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос в котором группируется большое кол-во данных
Maxim Boguk
polin11,

1)так вполне логично что чем больше записей обрабатывается тем дольше запрос.

2)обьясните смысл использования distinct в 2х местах... он там помоему ну совсем не нужен а время тратит

3)как видно запрос начинает временные файлы писать а это его сильно замедляет
рекомендую поднять work_mem до уровня чтобы временных файлов не было (в вашем случае я думаю 32MB или 64MB должно хватать)

4)зачем вы 2 раза тяжелый join делаете?
вам надо 1 раз сделать его а делить на user_null/user_not_null уже потом

5)зачем вы используете union там где по смыслу очевидно union all надо? откуда у вас там дубликаты в конце могут быть.

6)зачем у вас join там где exists скорее всего требуется?

7)зачем у вас фильтр по "Account" делается через with/ar вместо прямого указания pp."Account" = ANY('{3344433}'::bigint[]) ?


Спасибо за конструктивную помощь.

1) это понятно
2) действительно distinct лишний
3) проверил с work_mem 64MB
4) используется 2 inner join, чтобы попасть в индексы iUser и iUserNull
5) действительно нужен union all
6) проверил с exist
7) CTE таблица ar используется дальше в запросе, я привел только основную проблемную часть


План запроса, который вы предложили, идет Parallel Seq Scan

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
"Append  (cost=554054.06..578339.01 rows=485699 width=64) (actual time=4093.699..5233.541 rows=107270 loops=1)"
"  Buffers: shared hit=35118 read=255323 dirtied=288"
"  CTE users"
"    ->  GroupAggregate  (cost=539909.61..554054.06 rows=485699 width=64) (actual time=4093.693..5166.965 rows=107270 loops=1)"
"          Group Key: pp."Account", pp."User", pp."Event""
"          Buffers: shared hit=35118 read=255323 dirtied=288"
"          ->  Sort  (cost=539909.61..541255.14 rows=538214 width=37) (actual time=4093.647..4159.181 rows=375153 loops=1)"
"                Sort Key: pp."Account", pp."User", pp."Event""
"                Sort Method: quicksort  Memory: 41592kB"
"                Buffers: shared hit=35118 read=255323 dirtied=288"
"                ->  Gather  (cost=64307.52..488677.50 rows=538214 width=37) (actual time=83.318..3695.954 rows=375153 loops=1)"
"                      Workers Planned: 2"
"                      Workers Launched: 2"
"                      Buffers: shared hit=35118 read=255323 dirtied=288"
"                      ->  Hash Join  (cost=63307.52..433856.10 rows=224256 width=37) (actual time=86.979..3648.937 rows=125051 loops=3)"
"                            Hash Cond: ((pp."Account" = ar."Account") AND (pp."Event" = ar."Event"))"
"                            Buffers: shared hit=35118 read=255323 dirtied=288"
"                            ->  Parallel Seq Scan on "Documents" pp  (cost=0.00..366622.77 rows=224510 width=37) (actual time=20.147..3522.823 rows=190164 loops=3)"
"                                  Filter: ("Account" = ANY ('{3344433}'::bigint[]))"
"                                  Rows Removed by Filter: 7598152"
"                                  Buffers: shared hit=2899 read=255323"
"                            ->  Hash  (cost=62905.10..62905.10 rows=26828 width=12) (actual time=63.953..63.954 rows=23925 loops=3)"
"                                  Buckets: 32768  Batches: 1  Memory Usage: 1285kB"
"                                  Buffers: shared hit=32219 dirtied=288"
"                                  ->  HashAggregate  (cost=62636.82..62905.10 rows=26828 width=12) (actual time=52.726..58.804 rows=23925 loops=3)"
"                                        Group Key: ar."Account", ar."Event""
"                                        Buffers: shared hit=32219 dirtied=288"
"                                        ->  Bitmap Heap Scan on "Actualdocuments" ar  (cost=1886.52..62499.18 rows=27527 width=12) (actual time=7.342..43.597 rows=25529 loops=3)"
"                                              Recheck Cond: (("Account" IS NOT NULL) AND ("MinimalDate" IS NOT NULL))"
"                                              Filter: ("MinimalDate" < '2021-09-20'::date)"
"                                              Rows Removed by Filter: 4136"
"                                              Heap Blocks: exact=10368"
"                                              Buffers: shared hit=32219 dirtied=288"
"                                              ->  Bitmap Index Scan on "iMinimalDate"  (cost=0.00..1879.64 rows=30271 width=0) (actual time=5.854..5.855 rows=59632 loops=3)"
"                                                    Buffers: shared hit=1115"
"  ->  CTE Scan on users  (cost=0.00..9713.98 rows=483271 width=64) (actual time=4093.698..5214.778 rows=107202 loops=1)"
"        Filter: ("Responsible" IS NOT NULL)"
"        Rows Removed by Filter: 68"
"        Buffers: shared hit=35118 read=255323 dirtied=288"
"  ->  CTE Scan on users users_1  (cost=0.00..9713.98 rows=2428 width=64) (actual time=9.892..10.511 rows=68 loops=1)"
"        Filter: ("Responsible" IS NULL)"
"        Rows Removed by Filter: 107202"
"Planning time: 1.561 ms"
"Execution time: 5248.260 ms"



Немного модифицировал ваш запрос, получилось чуть-лучше по времени и памяти
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
WITH         
        user_null AS (
            SELECT
                 pp."Account" AS "Account",
                pp."User" AS "Responsible",
                pp."Event" AS "Event",
                array_agg(DISTINCT pp."Subscriber") AS "Subscriber",
                MIN(pp."EndDate") AS "MinimalDate"
            FROM "Documents" pp           
            WHERE
            EXISTS (
               SELECT FROM "ActualDocuments" ar WHERE      
               ar."Account"=pp."Account"
               AND ar."Event"=pp."Event"
               AND ar."MinimalDate" < '2021-09-20'::date
            )
            AND pp."Account" = ANY('{3344433}'::bigint[])
            AND PP."User" IS NULL
            GROUP BY pp."Account", pp."User", pp."Event"
        ),
          user_not_null AS (
            SELECT
                 pp."Account" AS "Account",
                pp."User" AS "Responsible",
                pp."Event" AS "Event",
                array_agg(DISTINCT pp."Subscriber") AS "Subscriber",
                MIN(pp."EndDate") AS "MinimalDate"
            FROM "Documents" pp           
            WHERE
            EXISTS (
               SELECT FROM "ActualDocuments" ar WHERE      
               ar."Account"=pp."Account"
               AND ar."Event"=pp."Event"
               AND ar."MinimalDate" < '2021-09-20'::date
            )
            AND pp."Account" = ANY('{3344433}'::bigint[])
            AND PP."User" IS NOT NULL
            GROUP BY pp."Account", pp."User", pp."Event"
        )
		SELECT *
		FROM user_null
		UNION ALL
		SELECT *
		FROM user_not_null



План модифицированного запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
"Append  (cost=567273.36..577227.04 rows=497684 width=64) (actual time=562.355..1880.952 rows=107270 loops=1)"
"  Buffers: shared hit=252269 read=3814"
"  CTE user_null"
"    ->  GroupAggregate  (cost=319635.76..331952.99 rows=426295 width=64) (actual time=562.346..1187.927 rows=68 loops=1)"
"          Group Key: pp."Account", pp."User", pp."Event""
"          Buffers: shared hit=210614 read=3814"
"          ->  Sort  (cost=319635.76..320800.51 rows=465903 width=37) (actual time=558.398..571.100 rows=225472 loops=1)"
"                Sort Key: pp."Account", pp."User", pp."Event""
"                Sort Method: quicksort  Memory: 23753kB"
"                Buffers: shared hit=210614 read=3814"
"                ->  Nested Loop  (cost=62637.38..275771.76 rows=465903 width=37) (actual time=39.937..432.840 rows=225472 loops=1)"
"                      Buffers: shared hit=210614 read=3814"
"                      ->  HashAggregate  (cost=62636.82..62905.10 rows=26828 width=12) (actual time=39.843..46.629 rows=23925 loops=1)"
"                            Group Key: ar."Account", ar."Event""
"                            Buffers: shared hit=10740"
"                            ->  Bitmap Heap Scan on "ActualDocuments" ar  (cost=1886.53..62499.18 rows=27527 width=12) (actual time=7.749..30.135 rows=25529 loops=1)"
"                                  Recheck Cond: (("Account" IS NOT NULL) AND ("MinimalDate" IS NOT NULL))"
"                                  Filter: ("MinimalDate" < '2021-09-20'::date)"
"                                  Rows Removed by Filter: 4136"
"                                  Heap Blocks: exact=10368"
"                                  Buffers: shared hit=10740"
"                                  ->  Bitmap Index Scan on "iMinimalDate"  (cost=0.00..1879.64 rows=30271 width=0) (actual time=5.592..5.593 rows=59646 loops=1)"
"                                        Buffers: shared hit=372"
"                      ->  Index Scan using "iUserNull" on "Documents" pp  (cost=0.56..7.92 rows=1 width=37) (actual time=0.000..0.015 rows=9 loops=23925)"
"                            Index Cond: (("Account" = ar."Account") AND ("Account" = ANY ('{3344433}'::bigint[])) AND ("Event" = ar."Event"))"
"                            Buffers: shared hit=199874 read=3814"
"  CTE user_not_null"
"    ->  GroupAggregate  (cost=233343.23..235320.37 rows=71389 width=64) (actual time=374.826..640.014 rows=107202 loops=1)"
"          Group Key: pp_1."Account", pp_1."User", pp_1."Event""
"          Buffers: shared hit=41655"
"          ->  Sort  (cost=233343.23..233524.02 rows=72319 width=37) (actual time=374.790..395.735 rows=149681 loops=1)"
"                Sort Key: pp_1."Account", pp_1."User", pp_1."Event""
"                Sort Method: quicksort  Memory: 17839kB"
"                Buffers: shared hit=41655"
"                ->  Hash Join  (cost=65893.18..227506.33 rows=72319 width=37) (actual time=73.259..213.860 rows=149681 loops=1)"
"                      Hash Cond: ((pp_1."Account" = ar_1."Account") AND (pp_1."Event" = ar_1."Event"))"
"                      Buffers: shared hit=41655"
"                      ->  Bitmap Heap Scan on "Documents" pp_1  (cost=2585.66..162932.80 rows=72401 width=37) (actual time=25.518..122.296 rows=211068 loops=1)"
"                            Recheck Cond: (("Account" = ANY ('{3344433}'::bigint[])) AND ("User" IS NOT NULL))"
"                            Heap Blocks: exact=29287"
"                            Buffers: shared hit=30915"
"                            ->  Bitmap Index Scan on "iUser"  (cost=0.00..2567.56 rows=72401 width=0) (actual time=20.258..20.259 rows=211286 loops=1)"
"                                  Index Cond: ("Account" = ANY ('{3344433}'::bigint[]))"
"                                  Buffers: shared hit=1628"
"                      ->  Hash  (cost=62905.10..62905.10 rows=26828 width=12) (actual time=47.659..47.660 rows=23925 loops=1)"
"                            Buckets: 32768  Batches: 1  Memory Usage: 1285kB"
"                            Buffers: shared hit=10740"
"                            ->  HashAggregate  (cost=62636.82..62905.10 rows=26828 width=12) (actual time=36.495..42.750 rows=23925 loops=1)"
"                                  Group Key: ar_1."Account", ar_1."Event""
"                                  Buffers: shared hit=10740"
"                                  ->  Bitmap Heap Scan on "ActualDocuments" ar_1  (cost=1886.53..62499.18 rows=27527 width=12) (actual time=5.374..27.429 rows=25529 loops=1)"
"                                        Recheck Cond: (("Account" IS NOT NULL) AND ("MinimalDate" IS NOT NULL))"
"                                        Filter: ("MinimalDate" < '2021-09-20'::date)"
"                                        Rows Removed by Filter: 4136"
"                                        Heap Blocks: exact=10368"
"                                        Buffers: shared hit=10740"
"                                        ->  Bitmap Index Scan on "iMinimalDate"  (cost=0.00..1879.64 rows=30271 width=0) (actual time=3.881..3.881 rows=59646 loops=1)"
"                                              Buffers: shared hit=372"
"  ->  CTE Scan on user_null  (cost=0.00..8525.90 rows=426295 width=64) (actual time=562.355..1188.828 rows=68 loops=1)"
"        Buffers: shared hit=210614 read=3814"
"  ->  CTE Scan on user_not_null  (cost=0.00..1427.78 rows=71389 width=64) (actual time=374.829..683.645 rows=107202 loops=1)"
"        Buffers: shared hit=41655"
"Planning time: 1.926 ms"
"Execution time: 1894.356 ms"
...
Рейтинг: 0 / 0
29.09.2021, 12:37
    #40100648
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос в котором группируется большое кол-во данных
polin11,

У вас не хватает индекса по
"Documents"("Account")
что я и подозревал когда писал про "и покажите план... может ещё надо будет индекс добавить."
Тогда и быстрее будет.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
29.09.2021, 12:43
    #40100650
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос в котором группируется большое кол-во данных
polin11,

Ещё можно сделать без union all и без WITH вообще.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
explain (analyze,costs,buffers,timing)
            SELECT
                pp."Account" AS "Account",
                pp."User" AS "Responsible",
                pp."Event" AS "Event",
                array_agg(DISTINCT pp."Subscriber") AS "Subscriber",
                MIN(pp."EndDate") AS "MinimalDate"
            FROM "Documents" pp           
            WHERE
            EXISTS (
               SELECT FROM "ActualDocuments" ar WHERE      
               ar."MinimalDate" < '2021-09-20'::date
               AND ar."Account"=pp."Account"
               AND ar."Event"=pp."Event"
            )
            AND pp."Account" = ANY('{3344433}'::bigint[])
            GROUP BY pp."Account", pp."User", pp."Event"
            ORDER BY pp."User" IS NOT NULL;




--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос в котором группируется большое кол-во данных / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]