On 7/26/05, Csaba Nagy <[EMAIL PROTECTED]> wrote:
> Hi all,
> 
> Jumping in directly to the subject, this is what I get:
> 
> explain SELECT bigint_col_1, bigint_col_2 FROM big_table WHERE
> bigint_col_2 in (12132131, null, null, null,
> null);
> 
> QUERY PLAN
> -------------------------------------------------------------------
>  Seq Scan on big_table  (cost=0.00..2447201.85 rows=448 width=16)
>   Filter: ((bigint_col_2 = 12132131::bigint) OR NULL::boolean)
> (2 rows)
> 
> 

this is because null values can't be indexed... or telling other way
the planner will never choose an index for comparing to null

maybe a partial index can be used?


> Compared to:
> 
> 
> explain SELECT bigint_col_1, bigint_col_2 FROM big_table WHERE
> bigint_col_2 in (12132131, 123781, 1297839032, 123667123);
> 
> QUERY PLAN
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  Index Scan using dom_idx_member_bigint_col_2,
> dom_idx_member_bigint_col_2, dom_idx_member_bigint_col_2,
> dom_idx_member_bigint_col_2 on big_table  (cost=0.00..6427.28 rows=1789
> width=16)
>   Index Cond: ((bigint_col_2 = 12132131) OR (bigint_col_2 = 123781) OR
> (bigint_col_2 = 1297839032) OR (bigint_col_2 = 123667123))
> (2 rows)
> 
> 
> big_table has ~ 100 million rows.
> 

there is no nulls here so the index can be used

> 
> Considering that NULL::boolean is always false, 
> 

null::boolean  is null not false. that is because null means 'unknown
value'  not false nor true

template1=# select null::boolean;
 bool
------

(1 fila)


-- 
regards,
Jaime Casanova
(DBA: DataBase Aniquilator ;)

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to