I noticed that the optimizer expects one row when there is a condition on the field for which optimizer does not know the value based on statistics, e.g.
postgres=# create table t1 (a int, b int);
CREATE TABLE
postgres=# insert into t1 values (generate_series(1,1000),1);
INSERT 0 1000
and so on...
postgres=# insert into t1 values (generate_series(4001,5000),5);
INSERT 0 1000
postgres=# analyze t1;
ANALYZE
postgres=# explain select * from t1 where b=5;
QUERY PLAN
------------------------------------------------------
Seq Scan on t1 (cost=0.00..85.50 rows=1000 width=8)
Filter: (b = 5)
(2 rows)
postgres=# explain select * from t1 where b=6;
QUERY PLAN
---------------------------------------------------
Seq Scan on t1 (cost=0.00..85.50 rows=1 width=8)
Filter: (b = 6)
(2 rows)
do you know if there is a formula for such a cardinality based on the size of the table or is it always one row?
can you point to the source code location?
Thanks,
Igor