> Não sabia que CASTS deixava querys mais lentas. No máximo a diferença é
imperceptível, ou estou errado?
Nesse SQL abaixo fez muita diferença o cast
> Cadê os planos de execução com a visão e sem ela provando o ocorrido?
Infelizmente não tenho salvo a melhor situação pra representar este caso,
onde um simples "select * from view_x" representava o problema.
Neste caso pode ser que eu esteja equivocado, mas isto é ao menos muito
estranho.
O SQL abaixo representa uma situação em que era feito um LEFT JOIN com a
view e ficava lento. Peguei o fonte da view e coloquei como sub-query no
local em que a mesma era utilizada, removi 2 join's que eram feitos e
deixei fixo no SQL o estado "MT".
Não vamos tratar do assunto da reorganização do PG deixar a view lenta
porque alterei o SQL da view....mas vamos ver intão porque o cast indicado
no SQL deixa o comando 2 minutos mais lento, e porque nos outros pontos o
cast não faz diferença.
Nota: Na comparação indicada que e feito cast, o tipo de dados dos 2 campos
é o mesmo dominio criado do tipo integer.
Nota2: A sub-query executa independente funciona rapidamente, o problema é
quando fiz o join com a sub-query.
select l.dt_promocao_inicial,
l.dt_promocao_final,
l.dt_fixo_inicial,
l.dt_fixo_final,
l.dt_venda,
l.dt_custo,
l.dt_promocao,
l.dt_fixo,
l.hr_venda,
l.hr_custo,
l.hr_promocao,
l.hr_fixo,
p.qt_pontos,
p.nr_produto,
l.tp_etiqueta_seguranca,
l.tp_promocao,
l.is_consulta_frente,
p.is_multiplicar_frente,
p.tp_venda,
p.is_excluido,
p.is_imagem,
p.nm_produto,
p.nm_reduzido,
l.cd_loja,
l.cd_produto,
l.cd_usuario_desc_finalizadora,
l.cd_usuario_custo,
l.cd_usuario_venda,
l.cd_usuario_promocao,
l.cd_usuario_fixo,
p.cd_produto_nutricional,
l.vl_custo,
l.vl_venda,
l.vl_promocao,
l.vl_fixo,
p.is_etiqueta_gondola,
l.is_ativo,
p.cd_produto_semelhante,
p.cd_produto_raquete,
l.per_desc_finalizadora,
pil.pr_icms,
pil.tp_icms,
p.per_perda,
p.cd_produto_movimento,
p.qt_fracionado,
p.cd_produto_vasilhame
from produto.tb_produto_loja l
inner join produto.tb_produto p
on (p.cd_produto = l.cd_produto)
left join (
SELECT
pl.cd_loja,
l.nr_loja,
pi.cd_produto,
pi.nr_produto,
pi.pr_icms,
pi.tp_icms,
pi.nr_cst,
pi.pr_red_bc_icms,
pi.pr_icms_producao_propria_up,
pi.tp_icms_producao_propria_up,
pi.nr_cst_producao_propria_up,
pi.pr_red_bc_icms_producao_propria_up,
pi.pr_icms_producao_propria_up_consumidor_final,
pi.tp_icms_producao_propria_up_consumidor_final,
pi.nr_cst_producao_propria_up_consumidor_final,
pi.pr_red_bc_icms_producao_propria_up_consumidor_final
FROM produto.tb_produto_loja pl
JOIN produto.vw_produto_icms pi
ON pi.cd_produto::integer = pl.cd_produto::integer
JOIN cadastro.tb_loja l
*/************** AQUI É ONDE A DIFERENÇA DE
PERFORMACE ACONTECE ****************/*
* ON l.cd_loja::integer = pl.cd_loja::integer*
* --ON l.cd_loja = pl.cd_loja*
* /**** SEM O CAST É INSTANTÂNEO, COM O CAST DEMORA
MAIS DE 2 MINUTO ***/*
WHERE pi.cd_uf_origem = 'MT'
AND pi.cd_uf_destino = 'MT'
) pil
on pil.cd_produto = l.cd_produto
and pil.cd_loja = l.cd_loja
where (l.cd_loja = 1);
Utilizando explain analyze nos SQL's
*========================== PLANO DE EXECUÇÃO SEM O CAST
=============================*
Hash Left Join (cost=1006.80..1639.02 rows=115 width=760) (actual
time=269.127..462.827 rows=25044 loops=1)
Hash Cond: (((l.cd_loja)::integer = (pl.cd_loja)::integer) AND
((l.cd_produto)::integer = (pfi.cd_produto)::integer))
-> Nested Loop (cost=5.15..633.12 rows=115 width=696) (actual
time=4.533..133.871 rows=25044 loops=1)
-> Bitmap Heap Scan on tb_produto_loja l (cost=5.15..216.65
rows=115 width=380) (actual time=4.516..30.849 rows=25044 loops=1)
Recheck Cond: ((cd_loja)::integer = 1)
-> Bitmap Index Scan on tb_produto_loja_pkey
(cost=0.00..5.12 rows=115 width=0) (actual time=4.175..4.175 rows=25044
loops=1)
Index Cond: ((cd_loja)::integer = 1)
-> Index Scan using tb_produto_pkey on tb_produto p
(cost=0.00..3.61 rows=1 width=320) (actual time=0.003..0.004 rows=1
loops=25044)
Index Cond: ((p.cd_produto)::integer =
(l.cd_produto)::integer)
-> Hash (cost=1000.33..1000.33 rows=88 width=72) (actual
time=264.567..264.567 rows=25044 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 1212kB
-> Nested Loop (cost=33.92..1000.33 rows=88 width=72) (actual
time=4.545..250.082 rows=25044 loops=1)
-> Nested Loop (cost=33.92..997.88 rows=88 width=72)
(actual time=4.534..233.620 rows=25044 loops=1)
-> Index Scan using tb_loja_pkey on tb_loja l
(cost=0.00..4.27 rows=1 width=4) (actual time=0.006..0.007 rows=1 loops=1)
Index Cond: ((cd_loja)::integer = 1)
-> Hash Left Join (cost=33.92..992.73 rows=88
width=72) (actual time=4.521..228.411 rows=25044 loops=1)
Hash Cond: ((pfi.cd_figura_icms)::integer =
(fi.cd_figura_icms)::integer)
-> Nested Loop (cost=5.15..962.75 rows=88
width=12) (actual time=4.267..200.753 rows=25044 loops=1)
-> Nested Loop (cost=5.15..633.90 rows=88
width=16) (actual time=4.259..119.687 rows=25044 loops=1)
-> Bitmap Heap Scan on
tb_produto_loja pl (cost=5.15..216.65 rows=115 width=8) (actual
time=4.237..15.280 rows=25044 loops=1)
Recheck Cond:
((cd_loja)::integer = 1)
-> Bitmap Index Scan on
tb_produto_loja_pkey (cost=0.00..5.12 rows=115 width=0) (actual
time=3.858..3.858 rows=25044 loops=1)
Index Cond:
((cd_loja)::integer = 1)
-> Index Scan using
tb_produto_uf_figura_icms_pkey on tb_produto_uf_figura_icms pfi
(cost=0.00..3.62 rows=1 width=16) (actual time=0.003..0.004 rows=1
loops=25044)
Index Cond:
(((pfi.cd_produto)::integer = (pl.cd_produto)::integer) AND
((pfi.cd_uf)::bpchar = 'MT'::bpchar))
Filter: ((pfi.cd_figura_icms IS
NOT NULL) OR (pfi.cd_figura_icms_producao_propria_up IS NOT NULL))
-> Index Scan using tb_produto_pkey on
tb_produto p (cost=0.00..3.72 rows=1 width=4) (actual time=0.002..0.003
rows=1 loops=25044)
Index Cond: ((p.cd_produto)::integer
= (pfi.cd_produto)::integer)
-> Hash (cost=18.90..18.90 rows=790 width=68)
(actual time=0.225..0.225 rows=378 loops=1)
Buckets: 1024 Batches: 1 Memory Usage:
18kB
-> Seq Scan on tb_figura_icms fi
(cost=0.00..18.90 rows=790 width=68) (actual time=0.005..0.107 rows=378
loops=1)
-> Materialize (cost=0.00..1.35 rows=1 width=0) (actual
time=0.000..0.000 rows=1 loops=25044)
-> Seq Scan on tb_uf u (cost=0.00..1.35 rows=1
width=0) (actual time=0.007..0.010 rows=1 loops=1)
Filter: ((cd_uf)::bpchar = 'MT'::bpchar)
*========================== PLANO DE EXECUÇÃO COM O CAST
=============================*
Nested Loop Left Join (cost=5.15..650.78 rows=115 width=760) (actual
time=88.376..195546.503 rows=25044 loops=1)
Join Filter: (((pl.cd_loja)::integer = (l.cd_loja)::integer) AND
((pfi.cd_produto)::integer = (l.cd_produto)::integer))
-> Nested Loop (cost=5.15..633.12 rows=115 width=696) (actual
time=4.278..618.965 rows=25044 loops=1)
-> Bitmap Heap Scan on tb_produto_loja l (cost=5.15..216.65
rows=115 width=380) (actual time=4.249..92.677 rows=25044 loops=1)
Recheck Cond: ((cd_loja)::integer = 1)
-> Bitmap Index Scan on tb_produto_loja_pkey
(cost=0.00..5.12 rows=115 width=0) (actual time=3.958..3.958 rows=25044
loops=1)
Index Cond: ((cd_loja)::integer = 1)
-> Index Scan using tb_produto_pkey on tb_produto p
(cost=0.00..3.61 rows=1 width=320) (actual time=0.014..0.018 rows=1
loops=25044)
Index Cond: ((p.cd_produto)::integer =
(l.cd_produto)::integer)
-> Materialize (cost=0.00..15.08 rows=1 width=72) (actual
time=0.000..1.972 rows=25044 loops=25044)
-> Nested Loop (cost=0.00..15.07 rows=1 width=72) (actual
time=0.141..465.186 rows=25044 loops=1)
-> Nested Loop Left Join (cost=0.00..13.71 rows=1 width=72)
(actual time=0.128..307.570 rows=25044 loops=1)
-> Nested Loop (cost=0.00..13.21 rows=1 width=12)
(actual time=0.102..229.093 rows=25044 loops=1)
-> Nested Loop (cost=0.00..8.92 rows=1
width=12) (actual time=0.061..129.322 rows=25044 loops=1)
-> Nested Loop (cost=0.00..5.30 rows=1
width=8) (actual time=0.035..27.287 rows=25044 loops=1)
-> Seq Scan on tb_loja l
(cost=0.00..1.01 rows=1 width=4) (actual time=0.005..0.005 rows=1 loops=1)
-> Index Scan using
tb_produto_loja_pkey on tb_produto_loja pl (cost=0.00..4.28 rows=1
width=8) (actual time=0.026..22.104 rows=25044 loops=1)
Index Cond:
(((pl.cd_loja)::integer = 1) AND ((pl.cd_loja)::integer =
(l.cd_loja)::integer))
-> Index Scan using tb_produto_pkey on
tb_produto p (cost=0.00..3.61 rows=1 width=4) (actual time=0.003..0.004
rows=1 loops=25044)
Index Cond: ((p.cd_produto)::integer
= (pl.cd_produto)::integer)
-> Index Scan using
tb_produto_uf_figura_icms_pkey on tb_produto_uf_figura_icms pfi
(cost=0.00..4.28 rows=1 width=16) (actual time=0.003..0.003 rows=1
loops=25044)
Index Cond: (((pfi.cd_produto)::integer =
(p.cd_produto)::integer) AND ((pfi.cd_uf)::bpchar = 'MT'::bpchar))
Filter: ((pfi.cd_figura_icms IS NOT NULL)
OR (pfi.cd_figura_icms_producao_propria_up IS NOT NULL))
-> Index Scan using tb_figura_icms_pkey on
tb_figura_icms fi (cost=0.00..0.49 rows=1 width=68) (actual
time=0.002..0.002 rows=1 loops=25044)
Index Cond: ((fi.cd_figura_icms)::integer =
(pfi.cd_figura_icms)::integer)
-> Seq Scan on tb_uf u (cost=0.00..1.35 rows=1 width=0)
(actual time=0.002..0.005 rows=1 loops=25044)
Filter: ((u.cd_uf)::bpchar = 'MT'::bpchar)
Total runtime: 195556.620 ms
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral