Decidimos migrar para 9.6 após algumas pesquisas sobre consultas paralelas, então trouxemos duas máquinas idênticas com exatamente o mesmo hardware, kernel e outras com PostgreSQL 9.1 e 9.6 respectivamente.
As versões 9.1 e 9.6 possuem a mesma configuração, exceto a configuração paralela que possui 5 workers paralelos no PostgreSQL 9.6.
Os resultados não são os que esperamos. No início, parece melhor que 9.1 para consultas simples comoselect * from something where big_string_column ilike '%test%';
Mas quando as consultas começam a ficar mais complexas, o PostgreSQL 9.1 começou a ganhar e por isso estou procurando ajuda. Tentamos desabilitar a consulta paralela, mas não adiantou. Não posso dar mais detalhes sobre a estrutura do banco de dados (desculpe), mas vai me ajudar se alguém já passou por algo parecido e resolveu.
A consulta (ofuscada) que executei em ambos:
SELECT case when lbipro = 1 then 'PEM'
when lbipro = 2 then 'CRE'
when lbipro = 3 then 'COM'
when lbipro = 4 then 'REC'
when lbipro = 6 then 'DES'
END pnom,
lbipro,
sum(lbival) as lim,
sum(coalesce(CASE WHEN lbisal > 0 THEN lbisal END,0)) dsp,
sum(coalesce(CASE WHEN lbisal <= 0 THEN lbisal END,0)) exc,
sum(coalesce(obiave,0)) as tom
FROM "lbi"
LEFT JOIN (SELECT sum(obiave) as obiave, obimat, obipro, obiscr
FROM obi
WHERE obicop = '022017'
GROUP BY obimat, obipro, obiscr) as oo
ON oo.obimat = lbimat
and oo.obipro = lbipro
WHERE lbicon = '5'
AND lbicop = '022017'
GROUP BY "lbipro"
ORDER BY "lbipro" ASC;
O plano gerado para 9.1 (explicar analisar):
Sort (cost=231411.25..231411.26 rows=1 width=46) (actual time=2389.223..2389.223 rows=3 loops=1)
Sort Key: lbi.lbipro
Sort Method: quicksort Memory: 25kB
-> HashAggregate (cost=231411.22..231411.24 rows=1 width=46) (actual time=2389.209..2389.214 rows=3 loops=1)
-> Hash Right Join (cost=193708.93..223165.41 rows=471189 width=46) (actual time=1698.385..1950.493 rows=458094 lo$
Hash Cond: (((obi.obimat)::text = (lbi.lbimat)::text) AND (obi.obipro = lbi.lbipro))
-> HashAggregate (cost=66042.93..66261.10 rows=21817 width=55) (actual time=470.412..536.613 rows=125480 loo$
-> Seq Scan on obi (cost=0.00..63861.29 rows=218164 width=55) (actual time=0.137..352.910 rows=215512 $
Filter: ((obicop)::text = '022017'::text)
-> Hash (cost=120598.17..120598.17 rows=471189 width=32) (actual time=1227.654..1227.654 rows=458094 loops=1)
Buckets: 65536 Batches: 1 Memory Usage: 29292kB
-> Seq Scan on lbi (cost=0.00..120598.17 rows=471189 width=32) (actual time=5.109..1093.313 rows=45809$
Filter: ((lbicon = 5) AND ((lbicop)::text = '022017'::text))
Total runtime: 2389.494 ms
O plano gerado para 9.6 (sim, é para a mesma consulta):
GroupAggregate (cost=244410.91..256931.05 rows=3 width=164) (actual time=7070.306..7547.298 rows=3 loops=1)
Group Key: lbi.lbipro
-> Merge Left Join (cost=244410.91..248891.54 rows=459395 width=46) (actual time=6789.774..7290.870 rows=458094 loops=1)
Merge Cond: ((lbi.lbipro = oo.obipro) AND ((lbi.lbimat)::text = (oo.obiave)::text))
-> Sort (cost=163803.11..164951.59 rows=459395 width=32) (actual time=5102.693..5220.945 rows=458094 loops=1)
Sort Key: lbi.lbipro, lbi.lbimat
Sort Method: quicksort Memory: 48077kB
-> Seq Scan on lbi (cost=0.00..120598.44 rows=459395 width=32) (actual time=6.580..1341.290 rows=458094 loop$
Filter: ((lbicon = 5) AND ((lbicop)::text = '022017'::text))
Rows Removed by Filter: 3518238
-> Sort (cost=80607.80..80945.86 rows=135222 width=54) (actual time=1687.073..1709.739 rows=125480 loops=1)
Sort Key: oo.obipro, oo.obiave
Sort Method: quicksort Memory: 12876kB
-> Subquery Scan on oo (cost=66041.03..69083.53 rows=135222 width=54) (actual time=695.702..803.308 rows=125$
-> HashAggregate (cost=66041.03..67731.31 rows=135222 width=81) (actual time=695.701..794.818 rows=125$
Group Key: obi.obiave, obi.obipro, obi.obiscr
-> Seq Scan on obi (cost=0.00..63861.41 rows=217962 width=55) (actual time=0.193..541.695 rows=2$
Filter: ((obicop)::text = '022017'::text)
Rows Removed by Filter: 1728890
Planning time: 1.528 ms
Execution time: 7555.976 ms
No PostgreSQL 9.1 o tempo de execução da consulta é de cerca de 1 ou 2 segundos. Para 9,6 é mais de 8 ou 9 segundos. Eu verifiquei a configuração muitas vezes e eles são idênticos agora. Eu removi a consulta paralela, mas ainda é mais lenta que 9.1. Eu até tentei penalizar 9,1 reduzindo work_mem
e shared_buffers
ou aumentando em 9,6, mas 9,1 ainda ganha. Eu corri vacuum analyze
muitas vezes.
Fiz o teste com o 9.4 e está agindo como 9.1. Eu suspeito que o 9.5 dará os mesmos resultados, e há algum bug de desempenho no 9.6. Eu larguei o banco de dados e o criei novamente em 9.6 - ainda é lento. O pior é que muitas consultas estão funcionando mais lentamente no 9.6 e algumas são mais rápidas.
Essa diferença é causada por algum tipo de otimização que eu possa desabilitar?
A versão específica é 9.6.2.
Parece que o PostgreSQL 9.6 precisa de um valor maior do
default_statistics_target
que no 9.1, suponho que seja porque o grande número de opções do planejador de consultas no 9.6.Aumentei de 1.000 para 2.000 e depois corri
analyze
.Agora está funcionando bem !