Re: bitmapscan test, no success, bs is not faster - Mailing list pgsql-hackers

From Oleg Bartunov
Subject Re: bitmapscan test, no success, bs is not faster
Date
Msg-id Pine.GSO.4.62.0504262029510.4489@ra.sai.msu.su
Whole thread Raw
In response to Re: bitmapscan test, no success, bs is not faster  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
It's interesting, that Tom's example behaves different on my notebook:

8.02 (default optimization)
regression=# explain analyze select * from tenk1 where hundred between 1 and 10 and thousand between 1 and 100;
                                                  QUERY PLAN 
 

----------------------------------------------------------------------------------------------------------------------------------
IndexScan using tenk1_thous_tenthous on tenk1  (cost=0.00..142.91 rows=1 width=244) (actual time=0.369..7.378 rows=100
loops=1)  Index Cond: ((thousand >= 1) AND (thousand <= 100))   Filter: ((hundred >= 1) AND (hundred <= 10)) Total
runtime:8.100 ms
 
(4 rows)

CVS HEAD
regression=# explain analyze select * from tenk1 where hundred between 1 and 10 and thousand between 1 and 100;
                                                      QUERY PLAN 
 

------------------------------------------------------------------------------------------------------------------------------------------
BitmapHeap Scan on tenk1  (cost=20.14..236.96 rows=98 width=244) (actual time=3.116..6.857 rows=100 loops=1)   Recheck
Cond:((hundred >= 1) AND (hundred <= 10) AND (thousand >= 1) AND (thousand <= 100))   ->  BitmapAnd  (cost=20.14..20.14
rows=98width=0) (actual time=3.009..3.009 rows=0 loops=1)         ->  Bitmap Index Scan on tenk1_hundred
(cost=0.00..9.83rows=971 width=0) (actual time=1.497..1.497 rows=1000 loops=1)               Index Cond: ((hundred >=
1)AND (hundred <= 10))         ->  Bitmap Index Scan on tenk1_thous_tenthous  (cost=0.00..10.07 rows=1011 width=0)
(actualtime=1.179..1.179 rows=1000 loops=1)               Index Cond: ((thousand >= 1) AND (thousand <= 100)) Total
runtime:7.568 ms
 
(8 rows)


On Tue, 26 Apr 2005, Tom Lane wrote:

> Pavel Stehule <stehule@kix.fsv.cvut.cz> writes:
>> I tested bitmap scan and maybe I didnt find good examples, but with bitmap
>> scan is slower than hashjoin. Only when I use non otiptimized SELECT bps
>> was little bit faster. All my SELECTs are equal.
>
> Bitmap scans can't possibly be any faster for cases where the indexscan
> only fetches one row, which is true of all your test cases AFAICS.
>
> It should be at least marginally faster than the old code for cases
> involving overlapping ORed conditions, that is
>     WHERE some-indexable-condition OR some-other-indexable-condition
> where the conditions retrieve some of the same rows.
>
> But I think the real win will come on ANDing of distinct indexes, that
> is
>     WHERE condition-for-index-A AND condition-for-index-B
> where neither of the index conditions is individually very selective but
> together they select just a few rows.  Before, the optimizer could only
> choose one index or the other ... but now it can use both.
>
> An example in the regression database is
>
> regression=# explain analyze select * from tenk1 where hundred between 1 and 10 and thousand between 1 and 100;
>                                                                QUERY PLAN
>
------------------------------------------------------------------------------------------------------------------------------------------
> Bitmap Heap Scan on tenk1  (cost=19.91..234.07 rows=94 width=244) (actual time=7.372..8.560 rows=100 loops=1)
>   Recheck Cond: ((hundred >= 1) AND (hundred <= 10) AND (thousand >= 1) AND (thousand <= 100))
>   ->  BitmapAnd  (cost=19.91..19.91 rows=94 width=0) (actual time=7.094..7.094 rows=0 loops=1)
>         ->  Bitmap Index Scan on tenk1_hundred  (cost=0.00..9.62 rows=937 width=0) (actual time=3.210..3.210
rows=1000loops=1)
 
>               Index Cond: ((hundred >= 1) AND (hundred <= 10))
>         ->  Bitmap Index Scan on tenk1_thous_tenthous  (cost=0.00..10.04 rows=1007 width=0) (actual time=3.147..3.147
rows=1000loops=1)
 
>               Index Cond: ((thousand >= 1) AND (thousand <= 100))
> Total runtime: 9.505 ms
> (8 rows)
>
> In 8.0 this looks like
>
> regression=# explain analyze select * from tenk1 where hundred between 1 and 10 and thousand between 1 and 100;
>                                              QUERY PLAN
> -------------------------------------------------------------------------------------------------------
> Seq Scan on tenk1  (cost=0.00..558.00 rows=99 width=244) (actual time=0.171..69.189 rows=100 loops=1)
>   Filter: ((hundred >= 1) AND (hundred <= 10) AND (thousand >= 1) AND (thousand <= 100))
> Total runtime: 70.013 ms
> (3 rows)
>
> The optimizer is a bit off on the relative merits of seqscan and
> indexscan for this case, but even the indexscan is not in the same
> ballpark, because it has to choose just one index to use:
>
> regression=# set enable_seqscan to 0;
> SET
> regression=# explain analyze select * from tenk1 where hundred between 1 and 10 and thousand between 1 and 100;
>                                                          QUERY PLAN
>
-------------------------------------------------------------------------------------------------------------------------------
> Index Scan using tenk1_hundred on tenk1  (cost=0.00..1455.48 rows=99 width=244) (actual time=10.762..24.454 rows=100
loops=1)
>   Index Cond: ((hundred >= 1) AND (hundred <= 10))
>   Filter: ((thousand >= 1) AND (thousand <= 100))
> Total runtime: 25.384 ms
> (4 rows)
>
>
>             regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: the planner will ignore your desire to choose an index scan if your
>      joining column's datatypes do not match
>
    Regards,        Oleg
_____________________________________________________________
Oleg Bartunov, sci.researcher, hostmaster of AstroNet,
Sternberg Astronomical Institute, Moscow University (Russia)
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(095)939-16-83, +007(095)939-23-83


pgsql-hackers by date:

Previous
From: David Wheeler
Date:
Subject: Re: DO INSTEAD and conditional rules
Next
From: Oleg Bartunov
Date:
Subject: Re: bitmapscan test, no success, bs is not faster