Обсуждение: index not being used

Поиск
Список
Период
Сортировка

index not being used

От
Reynard Hilman
Дата:
I'm having problem where index is not being used in query on very big
table (10 million rows), even after I set the enable_seqscan=off and
enable_indexscan=on. The query always choose seq scan when I do EXPLAIN.
This causes the query to take about 25 seconds to execute.
However, if the table only has 1 million rows, the query chooses the
index scan and only take about 80 msec.

here is the table structure:
create table test_10million (
id   int8,
app_id  int8
);

< fill the table with 10 million record >

create index test_10million_id on test_10million (id);

this query always uses sequential scan:
select * from test_10million where id = 123 and app_id = 100;

Does the number of rows matter here? (is 10 million too big for the
index table?).

thanks,
- reynard



Re: index not being used

От
Doug Fields
Дата:
You're missing an analyze step: (see below)

>here is the table structure:
>create table test_10million (
>id   int8,
>app_id  int8
>);
>
>< fill the table with 10 million record >
>
>create index test_10million_id on test_10million (id);

ANALYZE test_10million;

>this query always uses sequential scan:
>select * from test_10million where id = 123 and app_id = 100;

Now try

explain select * from test_10million where id = 123 and app_id = 100;

Cheers,

Doug



Re: index not being used

От
"Nigel J. Andrews"
Дата:
On Sat, 14 Dec 2002, Doug Fields wrote:

> You're missing an analyze step: (see below)
>
> >here is the table structure:
> >create table test_10million (
> >id   int8,
> >app_id  int8
> >);
> >
> >< fill the table with 10 million record >
> >
> >create index test_10million_id on test_10million (id);
>
> ANALYZE test_10million;
>
> >this query always uses sequential scan:
> >select * from test_10million where id = 123 and app_id = 100;
>
> Now try
>
> explain select * from test_10million where id = 123 and app_id = 100;
>

Not forgetting of course that the numbers used in the tests will probably need
to be cast to int8 or quoted to make into text constants before the index is
used. I'm surprised the 1 million row test used the index. Unless this is in
7.3 and the behaviour has changed (which I can't remember about).


--
Nigel J. Andrews


Re: index not being used

От
Reynard Hilman
Дата:
you're right about the int8 Nigel,

select * from test_10million where id = 123::int8 and app_id = 100;

does solve the problem (only takes 2.88 msec).
I forgot to mention that I use different table for the 1 million records, and it does use int4, so that explains why
indexworks for that table.  

thanks,
- reynard


Nigel J. Andrews wrote:

>On Sat, 14 Dec 2002, Doug Fields wrote:
>
>
>>You're missing an analyze step: (see below)
>>
>>
>>>here is the table structure:
>>>create table test_10million (
>>>id   int8,
>>>app_id  int8
>>>);
>>>
>>>< fill the table with 10 million record >
>>>
>>>create index test_10million_id on test_10million (id);
>>>
>>>
>>ANALYZE test_10million;
>>
>>
>>>this query always uses sequential scan:
>>>select * from test_10million where id = 123 and app_id = 100;
>>>
>>>
>>Now try
>>
>>explain select * from test_10million where id = 123 and app_id = 100
>>
>
>Not forgetting of course that the numbers used in the tests will probably need
>to be cast to int8 or quoted to make into text constants before the index is
>used. I'm surprised the 1 million row test used the index. Unless this is in
>7.3 and the behaviour has changed (which I can't remember about).
>
>