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

Responder a