postgresql: скорость выполнения count запросов (сбор статистики)

Рейтинг: 0Ответов: 0Опубликовано: 30.07.2023

В таблице есть поле типа TEXT в котором содержатся слова, разделённые ;. Требуется подсчитать кол-во отдельных слов. Делаю такой запрос:

SELECT 
    word AS value, COUNT(*) AS count
FROM (
    SELECT 
        trim(regexp_split_to_table(words, ';')) AS word
    FROM 
        tbl
) AS t
GROUP BY word;

хочется ускорить выполнение запроса, поэтому trim(regexp_split_to_table(words, ';')) решил сделать заранее и записать в отдельный столбец words_ex типа TEXT[]

после чего выполняю запрос:

SELECT 
    word AS value, COUNT(*) AS count
FROM (
    SELECT 
        unnest(words_ex) AS word
    FROM 
        tbl
) AS t
GROUP BY word

и наблюдаю ПЯТИКРАТНОЕ!!! падение скорости выполнения запроса

подскажите с чем это связано? вроде самые тяжелые операции уже выполнены были заранее (по сути регулярка и trim) и надо всего лишь выбирать данные из массива или в postgresql массивы - это жутко неоптимизированная вещь и лучше работать со строками?

P.S.

ранее я задавал схожий вопрос

postgresql: правильно построить индексы для ускорения выполнения запроса с group by

но он касался построения индексов

сейчас же хочется свести кол-во операций в БД к минимуму и потом (если это возможно) применить индексы

P.P.S.

прогнал на обоих запросах 'EXPLAIN ANALYZE':

быстрый с words:

"Finalize GroupAggregate  (cost=10042917338.46..10042917440.25 rows=200 width=40) (actual time=2208.246..2515.481 rows=2092 loops=1)"
"  Group Key: (TRIM(BOTH FROM (regexp_split_to_table(tbl.words, ';'::text))))"
"  ->  Gather Merge  (cost=10042917338.46..10042917434.25 rows=800 width=40) (actual time=2208.239..2514.877 rows=5797 loops=1)"
"        Workers Planned: 4"
"        Workers Launched: 4"
"        ->  Sort  (cost=10042916338.40..10042916338.90 rows=200 width=40) (actual time=2180.831..2180.867 rows=1159 loops=5)"
"              Sort Key: (TRIM(BOTH FROM (regexp_split_to_table(tbl.words, ';'::text))))"
"              Sort Method: quicksort  Memory: 118kB"
"              Worker 0:  Sort Method: quicksort  Memory: 111kB"
"              Worker 1:  Sort Method: quicksort  Memory: 111kB"
"              Worker 2:  Sort Method: quicksort  Memory: 110kB"
"              Worker 3:  Sort Method: quicksort  Memory: 110kB"
"              ->  Partial HashAggregate  (cost=10042916328.76..10042916330.76 rows=200 width=40) (actual time=2179.775..2179.896 rows=1159 loops=5)"
"                    Group Key: TRIM(BOTH FROM (regexp_split_to_table(tbl.words, ';'::text)))"
"                    Batches: 1  Memory Usage: 209kB"
"                    Worker 0:  Batches: 1  Memory Usage: 209kB"
"                    Worker 1:  Batches: 1  Memory Usage: 209kB"
"                    Worker 2:  Batches: 1  Memory Usage: 209kB"
"                    Worker 3:  Batches: 1  Memory Usage: 209kB"
"                    ->  Result  (cost=10000000000.00..10024624503.76 rows=1219455000 width=32) (actual time=96.119..1993.739 rows=1690967 loops=5)"
"                          ->  ProjectSet  (cost=10000000000.00..10006332678.76 rows=1219455000 width=32) (actual time=96.117..1796.086 rows=1690967 loops=5)"
"                                ->  Parallel Seq Scan on tbl  (cost=10000000000.00..10000226257.85 rows=1219455 width=8) (actual time=96.090..1025.872 rows=968947 loops=5)"
"Planning Time: 0.097 ms"
"JIT:"
"  Functions: 53"
"  Options: Inlining true, Optimization true, Expressions true, Deforming true"
"  Timing: Generation 6.835 ms, Inlining 206.469 ms, Optimization 174.555 ms, Emission 98.564 ms, Total 486.423 ms"
"Execution Time: 2522.639 ms"

медленный с words_ex:

"GroupAggregate  (cost=10007260007.70..10007625846.12 rows=200 width=40) (actual time=9228.554..10755.601 rows=2092 loops=1)"
"  Group Key: (unnest(tbl.words_ex))"
"  ->  Sort  (cost=10007260007.70..10007381953.17 rows=48778190 width=32) (actual time=9228.536..10160.660 rows=8454836 loops=1)"
"        Sort Key: (unnest(tbl.words_ex))"
"        Sort Method: quicksort  Memory: 789537kB"
"        ->  ProjectSet  (cost=10000000000.00..10000543316.08 rows=48778190 width=32) (actual time=87.291..3987.722 rows=8454836 loops=1)"
"              ->  Seq Scan on tbl  (cost=10000000000.00..10000262841.49 rows=4877819 width=35) (actual time=87.269..2886.321 rows=4844733 loops=1)"
"Planning Time: 0.145 ms"
"JIT:"
"  Functions: 7"
"  Options: Inlining true, Optimization true, Expressions true, Deforming true"
"  Timing: Generation 6.650 ms, Inlining 23.302 ms, Optimization 43.170 ms, Emission 20.648 ms, Total 93.769 ms"
"Execution Time: 10800.699 ms"

Ответы

Ответов пока нет.