On Thu, Dec 3, 2015 at 9:34 AM, Fernando Cambiaghi <cambia...@gmail.com>
wrote:

> Bom dia pessoal, perdoem minha ignorância, mas alguém poderia me explicar
> porque as duas consultas abaixo tem tempos de execução tão diferentes?
>
> EXPLAIN ANALYZE
> SELECT MAX( dh_emissao )
> FROM nf_venda
> WHERE dh_movimentacao_caixa >= ( getdate()::date - 2 )
>

O getdate() vai executar uma vez para cada registro verificado.


>
> Aggregate  (cost=98997.00..98997.01 rows=1 width=8) (actual
> time=2268.764..2268.764 rows=1 loops=1)
>   ->  Seq Scan on nf_venda  (cost=0.00..98716.50 rows=112200 width=8)
> (actual time=608.876..2268.601 rows=680 loops=1)
>         Filter: (dh_movimentacao_caixa >= ((getdate())::date - 2))
>         Rows Removed by Filter: 343186
> Planning time: 0.289 ms
> Execution time: 2268.817 ms
>
> __________________________________________________________
>
> EXPLAIN ANALYZE
> SELECT MAX( dh_emissao )
> FROM nf_venda
> WHERE dh_movimentacao_caixa >= ( SELECT getdate()::date - 2 )
>

Usando o SELECT, o getdate será executado uma única vez para toda consulta.


>
> Aggregate  (cost=12505.24..12505.25 rows=1 width=8) (actual
> time=0.704..0.704 rows=1 loops=1)
>   InitPlan 1 (returns $0)
>     ->  Result  (cost=0.00..0.27 rows=1 width=0) (actual time=0.072..0.072
> rows=1 loops=1)
>   ->  Bitmap Heap Scan on nf_venda  (cost=2145.97..12224.47 rows=112200
> width=8) (actual time=0.223..0.465 rows=681 loops=1)
>         Recheck Cond: (dh_movimentacao_caixa >= $0)
>         Heap Blocks: exact=41
>         ->  Bitmap Index Scan on idx_dh_movimentacao  (cost=0.00..2117.92
> rows=112200 width=0) (actual time=0.206..0.206 rows=681 loops=1)
>               Index Cond: (dh_movimentacao_caixa >= $0)
> Planning time: 0.396 ms
> Execution time: 0.796 ms
>

Isso acontece quando vc faz um update setando o nextval de uma sequence,
por exemplo. Se usar o SELECT, vai pegar o nextval uma única vez e setar
ele para todos registros. Sem o select, para cada registro executará o
nextval.

Como a única diferença entre as duas situações é o uso do SELECT, acredito
ser isso. Se me enganei me corrijam, também fiquei curioso com a diferença
de tempo entre as duas consultas.
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a