Received: from localhost (unknown [200.46.204.191]) by postgresql.org (Postfix) with ESMTP id 12C209FCB6C for ; Wed, 7 Nov 2007 22:46:53 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.191]) (amavisd-maia, port 10024) with ESMTP id 10570-05 for ; Wed, 7 Nov 2007 22:46:49 -0400 (AST) Received: from smtp3.clear.net.nz (smtp3.clear.net.nz [203.97.33.64]) by postgresql.org (Postfix) with ESMTP id 6B7F49FCB66 for ; Wed, 7 Nov 2007 22:46:48 -0400 (AST) Received: from zmori.markir.net (121-72-86-151.dsl.telstraclear.net [121.72.86.151]) by smtp3.clear.net.nz (CLEAR Net Mail) with ESMTP id <0JR600AD62DWD230@smtp3.clear.net.nz> for pgsql-performance@postgresql.org; Thu, 08 Nov 2007 15:46:45 +1300 (NZDT) Date: Thu, 08 Nov 2007 15:46:34 +1300 From: Mark Kirkwood Subject: Re: partitioned table and ORDER BY indexed_field DESC LIMIT 1 In-reply-to: <87r6j46gd0.fsf@oxford.xeocode.com> To: Gregory Stark Cc: Luke Lonergan , Heikki Linnakangas , Anton , pgsql-performance@postgresql.org Message-id: <4732788A.6050405@paradise.net.nz> MIME-version: 1.0 Content-type: multipart/mixed; boundary=------------010003070402090405040006 References: <4726C52E.5020909@paradise.net.nz> <87zly1as4y.fsf@oxford.xeocode.com> <472EAEE6.2090000@paradise.net.nz> <87r6j46gd0.fsf@oxford.xeocode.com> User-Agent: Thunderbird 2.0.0.6 (X11/20071025) X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200711/88 X-Sequence-Number: 27503 This is a multi-part message in MIME format. --------------010003070402090405040006 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Gregory Stark wrote: > "Mark Kirkwood" writes: > > >> I spent today looking at getting this patch into a self contained state. >> Working against HEAD I'm getting bogged down in the PathKeyItem to >> PathKey/EquivalenceClass/EquivalenceMember(s) change. So I figured I'd divide >> and conquer to some extent, and initially provide a patch: >> >> - against 8.2.(5) >> - self contained (i.e no mystery functions) >> > > That would be helpful for me. It would include the bits I'm looking for. > > >> The next step would be to update to to HEAD. That would hopefully provide some >> useful material for others working on this. >> > > If that's not too much work then that would be great but if it's a lot of work > then it may not be worth it if I'm planning to only take certain bits. On the > other hand if it's good then we might just want to take it wholesale and then > add to it. > > Here is a (somewhat hurried) self-contained version of the patch under discussion. It applies to 8.2.5 and the resultant code compiles and runs. I've left in some unneeded parallel stuff (PathLocus struct), which I can weed out in a subsequent version if desired. I also removed the 'cdb ' from most of the function names and (I hope) any Greenplum copyrights. I discovered that the patch solves a slightly different problem... it pulls up index scans as a viable path choice, (but not for the DESC case) but does not push down the LIMIT to the child tables ... so the actual performance improvement is zero - however hopefully the patch provides useful raw material to help. e.g - using the examine schema from the OP email - but removing the DESC from the query: part=# set enable_seqscan=off; SET part=# explain SELECT * FROM n_traf ORDER BY date_time LIMIT 1; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=198367.14..198367.15 rows=1 width=20) -> Sort (cost=198367.14..200870.92 rows=1001510 width=20) Sort Key: public.n_traf.date_time -> Result (cost=0.00..57464.92 rows=1001510 width=20) -> Append (cost=0.00..57464.92 rows=1001510 width=20) -> Index Scan using n_traf_date_time_login_id on n_traf (cost=0.00..66.90 rows=1510 width=20) -> Index Scan using n_traf_y2007m01_date_time_login_id on n_traf_y2007m01 n_traf (cost=0.00..4748.38 rows=83043 width=20) -> Index Scan using n_traf_y2007m02_date_time_login_id on n_traf_y2007m02 n_traf (cost=0.00..4772.60 rows=83274 width=20) -> Index Scan using n_traf_y2007m03_date_time_login_id on n_traf_y2007m03 n_traf (cost=0.00..4782.12 rows=83330 width=20) -> Index Scan using n_traf_y2007m04_date_time_login_id on n_traf_y2007m04 n_traf (cost=0.00..4818.29 rows=83609 width=20) -> Index Scan using n_traf_y2007m05_date_time_login_id on n_traf_y2007m05 n_traf (cost=0.00..4721.85 rows=82830 width=20) -> Index Scan using n_traf_y2007m06_date_time_login_id on n_traf_y2007m06 n_traf (cost=0.00..4766.56 rows=83357 width=20) -> Index Scan using n_traf_y2007m07_date_time_login_id on n_traf_y2007m07 n_traf (cost=0.00..4800.44 rows=83548 width=20) -> Index Scan using n_traf_y2007m08_date_time_login_id on n_traf_y2007m08 n_traf (cost=0.00..4787.55 rows=83248 width=20) -> Index Scan using n_traf_y2007m09_date_time_login_id on n_traf_y2007m09 n_traf (cost=0.00..4830.67 rows=83389 width=20) -> Index Scan using n_traf_y2007m10_date_time_login_id on n_traf_y2007m10 n_traf (cost=0.00..4795.78 rows=82993 width=20) -> Index Scan using n_traf_y2007m11_date_time_login_id on n_traf_y2007m11 n_traf (cost=0.00..4754.26 rows=83351 width=20) -> Index Scan using n_traf_y2007m12_date_time_login_id on n_traf_y2007m12 n_traf (cost=0.00..4819.51 rows=84028 width=20) (18 rows) --------------010003070402090405040006 Content-Type: application/x-gzip; name="index-order-by-wip.patch.gz" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="index-order-by-wip.patch.gz" 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 MIfg6TLBxdHh+QXzwP8CMTvvwQ/FAAA= --------------010003070402090405040006--