Em 26 de maio de 2017 23:13, Euler Taveira <[email protected]> escreveu:
>
> Você só soube depois que executou a consulta. EXPLAIN *não* executa a
> consulta. Ele se baseia em estatísticas coletadas e um modelo de custo (que
> nem sempre são exatos).
>
>

Sim, mas eu tinha esperança do planejador ter uma noção da quantidade de
registros. Inclusive, se no subselect eu fizer, em vez de /2, /3, /4, ou
/1000, a quantidade esperada de registros continua a mesma (o plano de
consulta também).


Por que você quer o valor correto? O Postgres não garante que suas
> estimativas são precisas (nem daria porque ele poderia perder muito tempo
> com planejamento ao invés de gastar o tempo em execução).
>
>
Para um projeto, o ideal seria ter estimativas o mais perto do real
possível.


> O Postgres está retornando um plano diferente ao substituir a subconsulta
> por 50000? Apresente os planos com e sem a subconsulta e, também, da
> subconsulta.
>
>

tpcds=# explain select * from catalog_returns, call_center, customer where
c_customer_sk < (select max(c_customer_sk)/2 from customer);
                                                                     QUERY
PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.66..570297812.84 rows=28813111866 width=1026)
   InitPlan 2 (returns $1)
     ->  Result  (cost=0.35..0.37 rows=1 width=0)
           InitPlan 1 (returns $0)
             ->  Limit  (cost=0.29..0.35 rows=1 width=8)
                   ->  Index Only Scan Backward using
customer_c_customer_sk_idx on customer customer_1  (cost=0.29..6051.30
rows=100000 width=8)
                         Index Cond: (c_customer_sk IS NOT NULL)
   ->  Nested Loop  (cost=0.29..210133913.07 rows=4802185311 width=539)
         ->  Index Scan using customer_c_customer_sk_idx on customer
 (cost=0.29..2028.85 rows=33333 width=307)
               Index Cond: (c_customer_sk < $1)
         ->  Materialize  (cost=0.00..10932.01 rows=144067 width=232)
               ->  Seq Scan on catalog_returns  (cost=0.00..5708.67
rows=144067 width=232)
   ->  Materialize  (cost=0.00..1.09 rows=6 width=487)
         ->  Seq Scan on call_center  (cost=0.00..1.06 rows=6 width=487)
(14 rows)


tpcds=# explain select * from catalog_returns, call_center, customer where
c_customer_sk < 50000;
                                                   QUERY PLAN
----------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.29..858754253.71 rows=43386929586 width=1026)
   ->  Nested Loop  (cost=0.29..316417632.81 rows=7231154931 width=539)
         ->  Index Scan using customer_c_customer_sk_idx on customer
 (cost=0.29..3048.34 rows=50193 width=307)
               Index Cond: (c_customer_sk < 50000)
         ->  Materialize  (cost=0.00..10932.01 rows=144067 width=232)
               ->  Seq Scan on catalog_returns  (cost=0.00..5708.67
rows=144067 width=232)
   ->  Materialize  (cost=0.00..1.09 rows=6 width=487)
         ->  Seq Scan on call_center  (cost=0.00..1.06 rows=6 width=487)
(8 rows)



tpcds=# explain select max(c_customer_sk)/2 from customer;
                                                          QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
 Result  (cost=0.35..0.37 rows=1 width=0)
   InitPlan 1 (returns $0)
     ->  Limit  (cost=0.29..0.35 rows=1 width=8)
           ->  Index Only Scan Backward using customer_c_customer_sk_idx on
customer  (cost=0.29..6051.30 rows=100000 width=8)
                 Index Cond: (c_customer_sk IS NOT NULL)
(5 rows)
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a