PostgreSQL 9.4
Eu tenho uma tabela chamada que tem um inteiro customers
de coluna . income
Depois de correr ANALYZE
contra ele, obtive a seguinte estatística para a coluna:
most_common_vals
{20000,80000,40000,60000,100000}
Agora, executo a seguinte consulta simples EXPLAIN ANALYZE SELECT * FROM customers WHERE income=123123
para entender a estimativa de contagem de linhas. Resultado:
Seq Scan on customers (cost=0.00..738.00 rows=1 width=268) (actual time=4.669..4.669 rows=0 loops=1)
Filter: (income = 123123)
Rows Removed by Filter: 20000
Como o otimizador não tem estatística para o income
valor 123123
, ele fez uma estimativa 0.5%
do tamanho da tabela. Portanto, a contagem de linhas estimada deveria ter sido 500
. Mas o otimizador retornou o arquivo 1
. Por quê? Talvez eu não tenha entendido o processo de estimativa de contagem de linhas de valores desconhecidos?
Você não poderia explicar um pouco?
Como não estava em most_common_vals,
PostgreSQL
procure no histograma. Se não houver histograma, concluiria que os valores mais comuns são os únicos valores presentes na tabela e, portanto, a estimativa para 123123 é zero. Mas não permite estimativas zero na maioria dos lugares, para evitar div por erro zero e, em vez disso, fixa-o em 1.0,5% é para casos em que não há informações, como para um plano de consulta genérico ou uma junção em que o valor não será conhecido no momento do planejamento.
Mas ter uma lista de MCV e aquele que você deseja não estar presente nessa lista e não haver histograma para o qual recorrer constitui informação.