From: | Kari Lavikka <tuner(at)bdb(dot)fi> |
---|---|
To: | pgsql-performance(at)postgresql(dot)org |
Subject: | Cost of indexscan |
Date: | 2004-01-30 08:16:23 |
Message-ID: | Pine.HPX.4.51.0401301010430.10015@purple.bdb.fi |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
Hi,
Postgres seems to estimate the cost of indexscan to be a bit too high.
The table has something like 500000 rows and I have run reindex and vacuum
analyze recently. Is there something to tune?
Index is a multicolumn index:
"admin_event_stamp_event_type_name_status" btree (stamp, event_type_name, status)
Singlecolumn index for stamp doesn't make a significant difference in cost
estimation.
-- -- -- -- -- -- -- -- -- --
galleria=> set enable_seqscan = true;
SET
galleria=> explain analyze SELECT * FROM admin_event WHERE stamp > (current_timestamp - '1 days'::INTERVAL)::TIMESTAMP WITHOUT TIME ZONE;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Seq Scan on admin_event (cost=0.00..19844.37 rows=154361 width=109) (actual time=479.173..2760.186 rows=4705 loops=1)
Filter: (stamp > ((('now'::text)::timestamp(6) with time zone - '1 day'::interval))::timestamp without time zone)
Total runtime: 2765.428 ms
(3 rows)
galleria=> set enable_seqscan = false;
SET
galleria=> explain analyze SELECT * FROM admin_event WHERE stamp > (current_timestamp - '1 days'::INTERVAL)::TIMESTAMP WITHOUT TIME ZONE;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Index Scan using admin_event_stamp_event_type_name_status on admin_event (cost=0.00..540690.18 rows=154361 width=109) (actual time=7.771..124.886 rows=4706 loops=1)
Index Cond: (stamp > ((('now'::text)::timestamp(6) with time zone - '1 day'::interval))::timestamp without time zone)
Total runtime: 82.530 ms
(3 rows)
-- -- -- -- -- -- -- -- -- --
Distribution of stamp looks like the following:
galleria=> SELECT date_trunc('month', stamp)::DATE, count(*), repeat('*', (count(*) / 3000)::INTEGER) FROM admin_event GROUP BY date_trunc('month', stamp)::DATE ORDER BY 1;
date_trunc | count | repeat
------------+--------+-------------------------------------------
2002-01-01 | 2013 |
2002-02-01 | 2225 |
2002-03-01 | 2165 |
2002-04-01 | 2692 |
2002-05-01 | 3031 | *
2002-06-01 | 2376 |
2002-07-01 | 2694 |
2002-08-01 | 4241 | *
2002-09-01 | 4140 | *
2002-10-01 | 4964 | *
2002-11-01 | 8769 | **
2002-12-01 | 13249 | ****
2003-01-01 | 5776 | *
2003-02-01 | 6301 | **
2003-03-01 | 6404 | **
2003-04-01 | 6905 | **
2003-05-01 | 7119 | **
2003-06-01 | 8978 | **
2003-07-01 | 7723 | **
2003-08-01 | 36566 | ************
2003-09-01 | 15759 | *****
2003-10-01 | 10610 | ***
2003-11-01 | 83113 | ***************************
2003-12-01 | 90927 | ******************************
2004-01-01 | 124479 | *****************************************
|\__/|
( oo ) Kari Lavikka - tuner(at)bdb(dot)fi - (050) 380 3808
__ooO( )Ooo_______ _____ ___ _ _ _ _ _ _ _
""
From | Date | Subject | |
---|---|---|---|
Next Message | lnd | 2004-01-30 08:47:51 | Re: Explain plan for 2 column index : timestamps and time zones |
Previous Message | Dennis Bjorklund | 2004-01-30 07:23:14 | Re: query optimization question |