I have a partial index that contains a predicate to check for whether the 
field deleted is false or not:

CREATE INDEX people_essays_any_essaytype_idx
    ON people_essays (person_id)
 WHERE NOT deleted;

The following query does NOT use the index:

EXPLAIN ANALYZE
SELECT *
  FROM people_essays
 WHERE person_id = 1
   AND deleted IS FALSE;
                                                   QUERY PLAN                   
                                
----------------------------------------------------------------------------------------------------------------
 Seq Scan on people_essays  (cost=0.00..10225.85 rows=4 width=67) (actual 
time=110.205..417.113 rows=4 loops=1)
   Filter: ((person_id = 1) AND (deleted IS FALSE))
 Total runtime: 417.203 ms
(3 rows)

EXPLAIN ANALYZE
SELECT *
  FROM people_essays
 WHERE person_id = 1
   AND deleted = FALSE;
                                                              QUERY PLAN        
                                                      
--------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using people_essays_uniq on people_essays  (cost=0.00..18.06 
rows=4 width=67) (actual time=35.094..35.971 rows=4 loops=1)
   Index Cond: (person_id = 1)
   Filter: (deleted = false)
 Total runtime: 36.070 ms
(4 rows)

EXPLAIN ANALYZE
SELECT *
  FROM people_essays
 WHERE person_id = 1
   AND NOT deleted;
                                                                   QUERY PLAN   
                                                                 
-------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using people_essays_any_essaytype_idx on people_essays  
(cost=0.00..18.05 rows=4 width=67) (actual time=0.034..0.047 rows=4 loops=1)
   Index Cond: (person_id = 1)
   Filter: (NOT deleted)
 Total runtime: 0.136 ms
(4 rows)


Though the index was created with "NOT deleted", shouldn't the planner 
evaluate "IS FALSE" as the same if "= FALSE" works?

---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

Reply via email to