> 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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a