Olá colegas,
Segue abaixo exemplo de query que estou executando (Query 1). Vejam que ela
faz um "Seq Scan" na tabela de cidades (2,6 milhões de registros) e demora
4000ms para executar.
A QUERY 2 faz um "Index Scan" e demora 17ms para executar e é exatamente
igual à QUERY 1, exceto o segundo join que foi alterado de:
left join vw_loc_origem_destino2 on vw_loc_origem_destino2.cd_codigo =
com_trafego.cd_origem_carga
Para:
left join vw_loc_origem_destino2 on vw_loc_origem_destino2.cd_codigo = 99
Seguem as queries:
** QUERY 1 **
select
com_oferta.cd_oferta
from
com_oferta
left join com_trafego on com_trafego.cd_oferta = com_oferta.cd_oferta
left join vw_loc_origem_destino2 on vw_loc_origem_destino2.cd_codigo =
com_trafego.cd_origem_carga
where
com_oferta.nr_oferta = 42
Analyze da QUERY1:
"Merge Right Join (cost=532877.64..606356.25 rows=26575 width=4)"
" Merge Cond: (loc_cidade.cd_cidade = com_trafego.cd_origem_carga)"
" -> Unique (cost=532873.86..572735.67 rows=2657454 width=22)"
" -> Sort (cost=532873.86..539517.49 rows=2657454 width=22)"
" Sort Key: loc_cidade.cd_cidade,
((loc_cidade.nm_cidade)::text), loc_cidade.cd_pais, loc_cidade.cd_regiao,
(3)"
" -> Append (cost=0.00..85796.08 rows=2657454 width=22)"
" -> Seq Scan on loc_cidade (cost=0.00..59220.51
rows=2657451 width=22)"
" -> Seq Scan on loc_porto (cost=0.00..1.03 rows=3
width=226)"
" -> Sort (cost=3.78..3.79 rows=2 width=8)"
" Sort Key: com_trafego.cd_origem_carga"
" -> Hash Left Join (cost=2.10..3.77 rows=2 width=8)"
" Hash Cond: (com_oferta.cd_oferta = com_trafego.cd_oferta)"
" -> Seq Scan on com_oferta (cost=0.00..1.63 rows=2 width=4)"
" Filter: (nr_oferta = 42)"
" -> Hash (cost=1.49..1.49 rows=49 width=8)"
" -> Seq Scan on com_trafego (cost=0.00..1.49 rows=49
width=8)"
****** QUERY 2 *********
select
com_oferta.cd_oferta
from
com_oferta
left join com_trafego on com_trafego.cd_oferta = com_oferta.cd_oferta
left join vw_loc_origem_destino2 on vw_loc_origem_destino2.cd_codigo = 99
where
com_oferta.nr_oferta = 42
Analyze da QUERY 2:
"Nested Loop Left Join (cost=11.73..13.51 rows=4 width=4)"
" -> Hash Left Join (cost=2.10..3.77 rows=2 width=4)"
" Hash Cond: (com_oferta.cd_oferta = com_trafego.cd_oferta)"
" -> Seq Scan on com_oferta (cost=0.00..1.63 rows=2 width=4)"
" Filter: (nr_oferta = 42)"
" -> Hash (cost=1.49..1.49 rows=49 width=4)"
" -> Seq Scan on com_trafego (cost=0.00..1.49 rows=49
width=4)"
" -> Materialize (cost=9.63..9.69 rows=2 width=0)"
" -> Subquery Scan on vw_loc_origem_destino2 (cost=9.63..9.68
rows=2 width=0)"
" -> Unique (cost=9.63..9.66 rows=2 width=124)"
" -> Sort (cost=9.63..9.63 rows=2 width=124)"
" Sort Key: loc_cidade.cd_cidade,
((loc_cidade.nm_cidade)::text), loc_cidade.cd_pais, loc_cidade.cd_regiao,
(3)"
" -> Append (cost=0.00..9.62 rows=2 width=124)"
" -> Index Scan using pk_cidade on
loc_cidade (cost=0.00..8.56 rows=1 width=22)"
" Index Cond: (cd_cidade = 99)"
" -> Seq Scan on loc_porto
(cost=0.00..1.04 rows=1 width=226)"
" Filter: (cd_porto = 99)"
Flavio Yamil Gómez
Diretor - Meta Virtual
Fone: (47) 3268 1780
Skype: flavio_yamil
Em 15 de janeiro de 2013 10:37, Flavio Yamil Gómez <
[email protected]> escreveu:
> Olá pessoal,
>
> Criei uma VIEW com três SELECTS usando o UNION.
>
> Quando executo um select na view, está demorando 5 segundos para retornar
> o resultado. Porém, executando os selects por separado, cada um demora 15ms
> em média.
>
> Detalhe: uma das tabelas contém 2,6 milhões de registros e possui os
> devidos índices criados.
> A instalação do postgres 9.1 é a padrão. Alguém poderia me dar alguma dica
> para melhorar esse desempenho?
>
> Outro detalhe importante:
>
> Ao chamar a consulta da view, quando comparo com um valor "colocado na
> mão" o retorno é instantâneo, porém quando comparo com um campo da tabela,
> daí demora. Vejam o código chamador:
>
> select com_oferta.nr_oferta
> from com_oferta
>
> left join com_trafego on com_trafego.cd_oferta = com_oferta.cd_oferta
> left join pro_produto on com_oferta.cd_produto = pro_produto.cd_produto
> left join vw_loc_origem_destino2 on vw_loc_origem_destino2.cd_codigo =
> com_trafego.cd_origem_carga --> Este é o comando problemático.
> --> Se eu comparar com um valor explícito, funciona rápido (= 3 por
> exemplo).
>
> where
> com_oferta.cd_produto = 1
>
>
>
>
>
> Segue código da view:
>
> CREATE OR REPLACE VIEW bs_dvm.vw_loc_origem_destino2 AS
>
> ( SELECT loc_cidade.cd_cidade AS cd_codigo,
> loc_cidade.nm_cidade::text as nm_nome,
> loc_cidade.cd_pais, loc_cidade.cd_regiao, 3 AS
> tp_tipo
> FROM bs_dvm.loc_cidade
> LEFT JOIN bs_dvm.loc_regiao ON loc_cidade.cd_regiao =
> loc_regiao.cd_regiao
> LEFT JOIN bs_dvm.loc_pais ON loc_cidade.cd_pais =
> loc_pais.cd_pais
>
> UNION
>
> SELECT loc_porto.cd_porto AS cd_codigo,
> loc_porto.nm_porto::text AS nm_nome,
> loc_porto.cd_pais, 0 AS cd_regiao, 2 AS tp_tipo
> FROM bs_dvm.loc_porto
> );
>
> ALTER TABLE bs_dvm.vw_loc_origem_destino
> OWNER TO postgres;
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral