"Shea,Dan [CIS]" <[EMAIL PROTECTED]> writes: > Indexes: > "forecastelement_vrwi_idx" btree (valid_time,region_id.wx_element.issue_time) > > explain analyze > SELECT DISTINCT ON (valid_time) > to_char(valid_time,'YYYYMMDDHH24MISS') AS valid_time, > value > from ( > SELECT valid_time,value, "time"(valid_time) AS hour, reception_time, > issue_time > FROM forecastelement > WHERE valid_time BETWEEN '2002-09-02 04:00:00' AND '2002-09-07 03:59:59' > AND region_id = 'PU-REG-WTO-00200' > AND wx_element = 'TEMP_VALEUR1' > AND issue_time BETWEEN '2002-09-02 05:00:00' AND '2002-09-06 05:00:00' > AND origin = 'REGIONAL' > AND "time"(issue_time) = '05:00:00' > ORDER BY issue_time,reception_time DESC,valid_time > ) AS foo > WHERE > ( date(valid_time) = date(issue_time)+1 -1 > OR date(valid_time) = date(issue_time)+1 > OR ( valid_time BETWEEN '2002-09-07 00:00:00' AND '2002-09-07 03:59:59' > AND issue_time = '2002-09-06 05:00:00' > ) > ) > ORDER BY valid_time ,issue_time DESC;
Incidentally, I find it easier to analyze queries when they've been formatted well. This makes what's going on much clearer. >From this it's clear your index doesn't match the query. Adding more columns will be useless because only the leading column "valid_time" will be used at all. Since you're fetching a whole range of valid_times the remaining columns are all irrelevant. They only serve to bloat the index and require reading a lot more data. You could either try creating an index just on valid_time, or create an index on (region_id,wx_element,valid_time) or (region_id,wx_element,issue_time) whichever is more selective. You could put wx_element first if it's more selective than region_id. Moreover, what purpose does the inner ORDER BY clause serve? It's only going to be re-sorted again by the outer ORDER BY. -- greg ---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faqs/FAQ.html