postgresql: скорость выполнения count запросов (сбор статистики)
В таблице есть поле типа 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"