Thread: ways to force index use?

ways to force index use?

From
Seth Ladd
Date:
Hello,

Thanks to all the previous suggestions for my previous question.  I've
done a lot more research and playing around since then, and luckily I
think I have a better understanding of postgresql.

I still have some queries that don't use an index, and I was wondering
if there were some other tricks to try out?

My system: RH9, PG 7.3.4, IDE, 1 gig RAM, celeron 1.7
My Table Columns (all bigints): start, stop, step1, step2, step3
My Indexes: btree(start), btree(stop), btree(start, stop)
Size of table: 16212 rows
Params: shared_buffers = 128, effective_cache_size = 8192

The Query: explain analyze select * from path where start = 653873 or
start = 649967 or stop = 653873 or stop = 649967

The Result:
Seq Scan on "path"  (cost=0.00..450.22 rows=878 width=48) (actual time=0
.08..40.50 rows=1562 loops=1)
 Filter: (("start" = 653873) OR ("start" = 649967) OR (stop = 653873) OR
 (stop = 649967))
Total runtime: 42.41 msec

Does anyone have a suggestion on how to get that query to use an index?
  Is it even possible?  I did run vacuum analyze right before this test.

I'm only beginning to customize the parameters in postgresql.conf
(mainly from tips from this list).

Thanks very much!
Seth


Re: ways to force index use?

From
Josh Berkus
Date:
Seth,

> The Query: explain analyze select * from path where start = 653873 or
> start = 649967 or stop = 653873 or stop = 649967

you need to cast all those numbers to BIGINT:

select * from path where start = 653873::BIGINT or
start = 649967::BIGINT or stop = 653873::BIGINT or stop = 649967::BIGINT

Then an index on start or stop should be used by the planner.

--
-Josh Berkus
 Aglio Database Solutions
 San Francisco


Re: ways to force index use?

From
Tom Lane
Date:
Seth Ladd <seth@picklematrix.net> writes:
> My Table Columns (all bigints): start, stop, step1, step2, step3
                    ^^^^^^^^^^^

> The Query: explain analyze select * from path where start = 653873 or
> start = 649967 or stop = 653873 or stop = 649967

> Does anyone have a suggestion on how to get that query to use an index?

Coerce the constants to bigint, for starters.  However, a query that is
selecting almost 10% of the table, as your example is, probably
*shouldn't* be using an index.

            regards, tom lane

Re: ways to force index use?

From
Seth Ladd
Date:
On Monday, Oct 13, 2003, at 21:24 Pacific/Honolulu, mila wrote:

> Seth,
>
>> My system: RH9, PG 7.3.4, IDE, 1 gig RAM, celeron 1.7
> ...
>> Size of table: 16212 rows
>> Params: shared_buffers = 128, effective_cache_size = 8192
>
> Just in case,
> the "shared_buffers" value looks a bit far too small for your system.
> I think you should raise it to at least 1024, or so.
>
> Effective cache size could be (at least) doubled, too ==> this might
> help forcing the index use.

Thanks!  I'm just beginning to play with these numbers.  I'll
definitely try them out.

I can't wait to try out the script that will help set these parameters!
:)

Seth