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: