Received: from localhost (wm.hub.org [200.46.204.128]) by postgresql.org (Postfix) with ESMTP id DA7D39FB2AA for ; Mon, 2 Oct 2006 20:51:44 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.128]) (amavisd-new, port 10024) with ESMTP id 82788-01 for ; Mon, 2 Oct 2006 23:51:36 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey- Received: from wolff.to (wolff.to [66.93.197.194]) by postgresql.org (Postfix) with SMTP id 310709FB2BA for ; Mon, 2 Oct 2006 20:51:35 -0300 (ADT) Received: (qmail 32721 invoked by uid 500); 3 Oct 2006 00:01:48 -0000 Date: Mon, 2 Oct 2006 19:01:47 -0500 From: Bruno Wolff III To: Graham Davis Cc: pgsql-bugs@postgresql.org, pgsql-performance@postgresql.org Subject: Re: BUG #2658: Query not using index Message-ID: <20061003000147.GA31475@wolff.to> Mail-Followup-To: Bruno Wolff III , Graham Davis , pgsql-performance@postgresql.org References: <200609272056.k8RKuWjY040283@wwwmaster.postgresql.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200609272056.k8RKuWjY040283@wwwmaster.postgresql.org> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests= X-Spam-Level: X-Archive-Number: 200610/16 X-Sequence-Number: 15885 This shouldn't have been submitted to the bugs list, as it isn't a bug. The best spot for this kind of question is the performance list so I am copying it there and redirecting followups there. On Wed, Sep 27, 2006 at 20:56:32 +0000, Graham Davis wrote: > > SELECT assetid, max(ts) AS ts > FROM asset_positions > GROUP BY assetid; > > I have an index on (ts), another index on (assetid) and a multikey index on > (assetid, ts). I know the assetid index is pointless since the multikey one > takes its place, but I put it there while testing just to make sure. The > ANALYZE EXPLAIN for this query is: > > QUERY PLAN > ---------------------------------------------------------------------------- > ------------------------------------------------------------- > HashAggregate (cost=125423.96..125424.21 rows=20 width=12) (actual > time=39693.995..39694.036 rows=20 loops=1) > -> Seq Scan on asset_positions (cost=0.00..116654.64 rows=1753864 > width=12) (actual time=20002.362..34724.896 rows=1738693 loops=1) > Total runtime: 39694.245 ms > (3 rows) > > You can see it is doing a sequential scan on the table when it should be > using the (assetid, ts) index, or at the very least the (ts) index. This > query takes about 40 seconds to complete with a table of 1.7 million rows. > I tested running the query without the group by as follows: > SELECT DISTINCT ON (assetid) assetid, ts > FROM asset_positions > ORDER BY assetid, ts DESC; This is almost what you want to do to get an alternative plan. But you need to ORDER BY assetid DESC, ts DESC to make use of the multicolumn index. If you really need the other output order, reverse it in your application or use the above as a subselect in another query that orders by assetid ASC.