From: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
---|---|
To: | Thom Brown <thom(at)linux(dot)com> |
Cc: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, depesz(at)depesz(dot)com, pgsql-general(at)postgresql(dot)org |
Subject: | Re: [9.2devel] why it doesn't do index scan only? |
Date: | 2011-10-08 18:30:05 |
Message-ID: | CAFj8pRD+ORznFXerWaviKWY8+i0rZM=vF7p+Rs31u-+gVqdiYA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
2011/10/8 Thom Brown <thom(at)linux(dot)com>:
> On 8 October 2011 18:53, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> wrote:
>> Hello
>>
>> 2011/10/8 Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>:
>>> hubert depesz lubaczewski <depesz(at)depesz(dot)com> writes:
>>>> it is selecting 20 rows out of 30 million. why is it:
>>>> 1. not using index only scan
>>>> 2. not using even normal index scan?
>>>
>>> It thinks the bitmap scan is cheaper. Whether that's true or not is not
>>> very clear, but nobody is claiming that the costing of index-only scans
>>> is accurate yet.
>>>
>>
>> I did a few tests and bitmap scan is faster. Maybe there is a some
>> issue. In very simple test (and very syntetic test)
>>
>> create table omega(a int);
>> insert into omega select (random()*10000)::int from generate_series(1,400000);
>>
>> select count(*) from omega where a = 100;
>>
>> and index scan is faster than index only scan. There is lot of
>> duplicates. When I used a bigger range, a speed of bitmap index, index
>> only scan and index scan is similar - but index scan was faster
>> everywhere.
>
> Here, index-only scan is massively faster than any other scan:
>
> test=# explain analyse select count(thing) from stuff where thing = 14;
>
> QUERY PLAN
> ----------------------------------------------------------------------------------------------------------------------------------------------------
> Aggregate (cost=99814.38..99814.39 rows=1 width=4) (actual
> time=337.506..337.506 rows=1 loops=1)
> -> Index Only Scan using idx_stuff_thing on stuff
> (cost=0.00..99336.88 rows=191000 width=4) (actual
> time=155.955..315.106 rows=196828 loops=1)
> Index Cond: (thing = 14)
> Total runtime: 337.639 ms
> (4 rows)
>
> test=# set enable_indexonlyscan to false;
> SET
> test=# explain analyse select count(thing) from stuff where thing = 14;
>
> QUERY PLAN
> ------------------------------------------------------------------------------------------------------------------------------------------------
> Aggregate (cost=99814.38..99814.39 rows=1 width=4) (actual
> time=164882.528..164882.528 rows=1 loops=1)
> -> Index Scan using idx_stuff_thing on stuff (cost=0.00..99336.88
> rows=191000 width=4) (actual time=0.184..164494.806 rows=196828
> loops=1)
> Index Cond: (thing = 14)
> Total runtime: 164882.666 ms
> (4 rows)
>
> test=# set enable_indexonlyscan to false;
> SET
> test=# set enable_indexscan to false;
> SET
> test=# explain analyse select count(thing) from stuff where thing = 14;
>
> QUERY PLAN
> -----------------------------------------------------------------------------------------------------------------------------------------------
> Aggregate (cost=170553.91..170553.92 rows=1 width=4) (actual
> time=154102.221..154102.222 rows=1 loops=1)
> -> Bitmap Heap Scan on stuff (cost=2004.91..170076.41 rows=191000
> width=4) (actual time=482.974..153730.892 rows=196828 loops=1)
> Recheck Cond: (thing = 14)
> -> Bitmap Index Scan on idx_stuff_thing (cost=0.00..1957.16
> rows=191000 width=0) (actual time=421.854..421.854 rows=196828
> loops=1)
> Index Cond: (thing = 14)
> Total runtime: 154107.415 ms
> (6 rows)
>
> test=# set enable_indexonlyscan to false;
> SET
> test=# set enable_indexscan to false;
> SET
> test=# set enable_bitmapscan to false;
> SET
> test=# explain analyse select count(thing) from stuff where thing = 14;
> QUERY PLAN
> --------------------------------------------------------------------------------------------------------------------------
> Aggregate (cost=812977.50..812977.51 rows=1 width=4) (actual
> time=121296.897..121296.897 rows=1 loops=1)
> -> Seq Scan on stuff (cost=0.00..812500.00 rows=191000 width=4)
> (actual time=67.105..121215.296 rows=196828 loops=1)
> Filter: (thing = 14)
> Rows Removed by Filter: 14803172
> Total runtime: 121296.999 ms
> (5 rows)
>
> Note: buffer cache cleared between queries.
I did it. It is strange, so your times are significantly slower than I
have. Have you enabled asserts?
Pavel
>
> --
> Thom Brown
> Twitter: @darkixion
> IRC (freenode): dark_ixion
> Registered Linux user: #516935
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
From | Date | Subject | |
---|---|---|---|
Next Message | Francisco Figueiredo Jr. | 2011-10-08 18:38:23 | Re: How to add xml data to table |
Previous Message | Thom Brown | 2011-10-08 18:21:05 | Re: [9.2devel] why it doesn't do index scan only? |