> 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