In output of explain command I found two terms 'Seq Scan' and 'Bitmap heap Scan'. Can somebody tell me what is the difference between these two types of scan? (I am using PostgreSql)
-
2To put it simply, "seq scan" is not using indexes (generally slower) and all other scans attempt to use indexes defined in the table. – Gnudiff Jan 04 '09 at 08:33
1 Answers
http://www.postgresql.org/docs/8.2/static/using-explain.html
Basically, a sequential scan is going to the actual rows, and start reading from row 1, and continue until the query is satisfied (this may not be the entire table, e.g., in the case of limit)
Bitmap heap scan means that PostgreSQL has found a small subset of rows to fetch (e.g., from an index), and is going to fetch only those rows. This will of course have a lot more seeking, so is faster only when it needs a small subset of the rows.
Take an example:
create table test (a int primary key, b int unique, c int);
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5);
Now, we can easily get a seq scan:
explain select * from test where a != 4
QUERY PLAN
---------------------------------------------------------
Seq Scan on test (cost=0.00..34.25 rows=1930 width=12)
Filter: (a <> 4)
It did a sequential scan because it estimates its going to grab the vast majority of the table; seeking to do that (instead of a big, seekless read) would be silly.
Now, we can use the index:
explain select * from test where a = 4 ;
QUERY PLAN
----------------------------------------------------------------------
Index Scan using test_pkey on test (cost=0.00..8.27 rows=1 width=4)
Index Cond: (a = 4)
And finally, we can get some bitmap operations:
explain select * from test where a = 4 or a = 3;
QUERY PLAN
------------------------------------------------------------------------------
Bitmap Heap Scan on test (cost=8.52..13.86 rows=2 width=12)
Recheck Cond: ((a = 4) OR (a = 3))
-> BitmapOr (cost=8.52..8.52 rows=2 width=0)
-> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0)
Index Cond: (a = 4)
-> Bitmap Index Scan on test_pkey (cost=0.00..4.26 rows=1 width=0)
Index Cond: (a = 3)
We can read this as:
- Build a bitmap of the rows we want for a=4. (Bitmap index scan)
- Build a bitmap of the rows we want for a=3. (Bitmap index scan)
- Or the two bitmaps together (BitmapOr)
- Look those rows up in the table (Bitmap Heap Scan) and check to make sure a=4 or a=3 (recheck cond)
[Yes, these query plans are stupid, but that's because we failed to analyze test
Had we analyzed it, they'd all be sequential scans, since there are 5 tiny rows]

- 49,731
- 15
- 94
- 124
-
1
-
1@derobert, what do you mean by "seeking"? Can't find any mention of it anywhere... – Vadim Samokhin Aug 03 '12 at 11:52
-
1@Zapadlo Seeking as in a disk seek, e.g., random access instead of sequential. – derobert Aug 03 '12 at 15:21
-
A Postgresql Bitmap Heap Scan won't revert to random access. The bitmap is a set of physical locations to scan, and the Bitmap Heap Scan will scan them in sorted order of physical location. Plus each page referred to by the bitmap will only be visited once in the scan. – simonp Apr 14 '14 at 15:49