Thread: Indexes in PostgreSQL
I was wondering if anyone could explain how to get the Query Analyzer to use an Index that is defined for the table instead of doing a table scan? I have a table with some indexes on it that seem NOT to get used when I think they should. :-) Not that I KNOW more than the Query Analyzer - but a Table Scan seems expensive - especially if an Index exists to help. Here is some of what I mean EXPLAIN ANALYZE select e.title,e."startDate",e."allDayFlag" from "Events" e where ownerid = 100000000093115 /* "Seq Scan on "Events" e (cost=0.00..10770.20 rows=8616 width=34) (actual time=0.035..1489.340 rows=10005 loops=1)" " Filter: (ownerid = 100000000093115::bigint)" "Total runtime: 1500.861 ms" INDEX "ownerid_IX" ON "Events" USING btree (ownerid); */ EXPLAIN ANALYZE select e.title,e."startDate",e."allDayFlag" from "Events" e where e."startDate" > '20050930' and e."endDate" < '20051101' /* "Seq Scan on "Events" e (cost=0.00..11706.64 rows=31739 width=34) (actual time=0.148..1171.191 rows=819 loops=1)" " Filter: (("startDate" > '2005-09-30 00:00:00'::timestamp without time zone) AND ("endDate" < '2005-11-01 00:00:00'::timestamp without time zone))" "Total runtime: 1173.067 ms" INDEX "dates_IX" ON "Events" USING btree ("startDate", "endDate"); */ These commands show the 'OUTPUT' that is in quotes in the comment - I also included the definition of the Index that I think it should use. Any help would be greatly appreciated. TIA... Jack
On Mon, Apr 18, 2005 at 12:25:33PM -0700, jackfitz@yahoo.com wrote: > I was wondering if anyone could explain how to get the Query Analyzer > to use an Index that is defined for the table instead of doing a table > scan? I have a table with some indexes on it that seem NOT to get used > when I think they should. :-) Not that I KNOW more than the Query > Analyzer - but a Table Scan seems expensive - especially if an Index > exists to help. > > Here is some of what I mean <snip> Your row estimates seem way off. Have you run ANALYZE recently? > EXPLAIN ANALYZE select e.title,e."startDate",e."allDayFlag" > from "Events" e where e."startDate" > '20050930' and e."endDate" < > '20051101' > /* > "Seq Scan on "Events" e (cost=0.00..11706.64 rows=31739 width=34) > (actual time=0.148..1171.191 rows=819 loops=1)" > " Filter: (("startDate" > '2005-09-30 00:00:00'::timestamp without > time zone) AND ("endDate" < '2005-11-01 00:00:00'::timestamp without > time zone))" > "Total runtime: 1173.067 ms" > INDEX "dates_IX" > ON "Events" > USING btree > ("startDate", "endDate"); > */ Have a nice day, -- Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/ > Patent. n. Genius is 5% inspiration and 95% perspiration. A patent is a > tool for doing 5% of the work and then sitting around waiting for someone > else to do the other 95% so you can sue them.
Attachment
Yes. Thanks. I ran VACUUM ANALYZE and got the same results... -Jack