order by index, and inheritance - Mailing list pgsql-performance

From Michiel Meeuwissen
Subject order by index, and inheritance
Date
Msg-id 20040419113013.GA32186@michiel.omroep.nl
Whole thread Raw
List pgsql-performance
I have a query which performs not so well:

SELECT * FROM mm_mediasources ORDER BY number DESC LIMIT 20;

costs nearly a minute. The table contains over 300 000 records.

The table has two extensions, which are (a the moment) nearly empty, but
have something to do with this, because:

SELECT * FROM only mm_mediasources ORDER BY number DESC LIMIT 20;

performs ok (8ms). The query plan is then as I would expect:

media=# explain SELECT * FROM only mm_mediasources ORDER BY number DESC
LIMIT 20;
                                                     QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..8.36 rows=20 width=105)
   ->  Index Scan Backward using mediasource_object on mm_mediasources
(cost=0.00..114641.05 rows=274318 width=105)



The query plan of the original query, without 'only' does table scans:

media=# explain SELECT * FROM mm_mediasources ORDER BY number DESC LIMIT 20;
                                               QUERY PLAN
--------------------------------------------------------------------------------------------------------
 Limit  (cost=47248.70..47248.75 rows=20 width=105)
   ->  Sort  (cost=47248.70..47934.52 rows=274328 width=105)
         Sort Key: public.mm_mediasources.number
         ->  Result  (cost=0.00..8364.28 rows=274328 width=105)
               ->  Append  (cost=0.00..8364.28 rows=274328 width=105)
                     ->  Seq Scan on mm_mediasources  (cost=0.00..8362.18 rows=274318 width=105)
                     ->  Seq Scan on mm_audiosources mm_mediasources (cost=0.00..1.01 rows=1 width=84)
                     ->  Seq Scan on mm_videosources mm_mediasources (cost=0.00..1.09 rows=9 width=89)

and presumably because if that performs so lousy.

Simply selecting on a number does work fast:
media=# explain SELECT * FROM mm_mediasources where number = 606973 ;
                                               QUERY PLAN
--------------------------------------------------------------------------------------------------------
 Result  (cost=0.00..6.13 rows=4 width=105)
   ->  Append  (cost=0.00..6.13 rows=4 width=105)
         ->  Index Scan using mediasource_object on mm_mediasources (cost=0.00..4.00 rows=2 width=105)
               Index Cond: (number = 606973)
         ->  Seq Scan on mm_audiosources mm_mediasources  (cost=0.00..1.01 rows=1 width=84)
               Filter: (number = 606973)
         ->  Seq Scan on mm_videosources mm_mediasources  (cost=0.00..1.11 rows=1 width=89)
               Filter: (number = 606973)

(3ms)

I suppose seq scans are used on the extensions because they contain so few
records.


All tables have index on number. How do I force it to use them also when I
use order by?

I use psql 7.3.2

Michiel

--
Michiel Meeuwissen       |
Mediapark C101 Hilversum |
+31 (0)35 6772979        |  I hate computers
nl_NL eo_XX en_US        |
mihxil'                  |
 [] ()                   |

pgsql-performance by date:

Previous
From: Tom Lane
Date:
Subject: Re: Wierd context-switching issue on Xeon
Next
From: Joe Conway
Date:
Subject: Re: Wierd context-switching issue on Xeon