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