X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.2]) by svr1.postgresql.org (Postfix) with ESMTP id E5AD9D1D1B9 for ; Thu, 29 Jan 2004 15:02:46 +0000 (GMT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (neptune.hub.org [200.46.204.2]) (amavisd-new, port 10024) with ESMTP id 63074-02 for ; Thu, 29 Jan 2004 11:02:25 -0400 (AST) Received: from postal.trymedia.com (204-247-59-99.trymedia.com [204.247.59.99]) by svr1.postgresql.org (Postfix) with ESMTP id 50A1BD1CA54 for ; Thu, 29 Jan 2004 11:02:13 -0400 (AST) Received: by postal.trymedia.com (Postfix, from userid 100) id 2A5F3236F52; Thu, 29 Jan 2004 07:02:21 -0800 (PST) Received: from localhost (localhost.localdomain [127.0.0.1]) by postal.trymedia.com (Postfix) with SMTP id 2828D236F5B; Thu, 29 Jan 2004 07:02:10 -0800 (PST) Received: from alexandra (233.Red-213-0-1.pooles.rima-tde.net [213.0.1.233]) by postal.trymedia.com (Postfix) with ESMTP id 173EB236F5E; Thu, 29 Jan 2004 07:02:07 -0800 (PST) Reply-To: From: "Alexandra Birch" To: Cc: Subject: Re: limit 1 and functional indexes Date: Thu, 29 Jan 2004 16:02:06 +0100 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 In-reply-to: <20040129125240.GA17068@wolff.to> Importance: Normal X-Virus-Scanned: by amavisd-new at postgresql.org X-Archive-Number: 200401/261 X-Sequence-Number: 16654 > > > > Postgres choses the wrong index when I add limit 1 to the query. > > This should not affect the index chosen. > > I don't know the complete answer to your question, but since no one else > has commented I will answer what I can. Thanks - your reply is apreciated :) > It IS reasobable for the planner to choose a different plan when you > add a LIMIT clause to a query. OK - I'll investigate this further. > > I read that functional indexes are sometimes not chosen correctly by > > optimizer. > > I don't believe there are any particular problems with functional indexes. > The opitmizer isn't perfect and will sometimes choose poor plans. OK - but there was some discussion about statistics for functional indexes, for eg: http://archives.postgresql.org/pgsql-general/2004-01/msg00978.php This does not help me solve my problem though :) > > Is there anything I can do to always use the functional index in the > > following queries? > > Have you done an ANALYZE of the table recently? Yip - I should have said we do a daily VACUUM ANALYZE. > It might be useful to see the EXPLAIN ANALYZE output, rather than just > the EXPLAIN output, as that will give the actual times needed to do > the various steps. I thought the cost values would be enough from the EXPLAIN alone. And the query takes so long to run :( Here is the output of EXPLAIN ANALYZE first with limit 1 then without: explain analyze select code from transactions where UPPER(pop) = UPPER('79bcdc8a4a4f99e7c111111111111111') order by order_date DESC LIMIT 1; -------------------------------------------------------------------------------------------------- Limit (cost=0.00..332.44 rows=1 width=33) (actual time=377745.75..377745.75 rows=0 loops=1) -> Index Scan Backward using transactions_date_aff on transactions (cost=0.00..982549.96 rows=2956 width=33) (actual time=377718.61..377718.61 rows=0 loops=1) Filter: (upper((pop)::text) = '79BCDC8A4A4F99E7C111111111111111'::text) Total runtime: 378439.32 msec explain analyze select code from transactions where UPPER(pop) = UPPER('79bcdc8a4a4f99e7c111111111111111') order by order_date DESC; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------ ------------- Sort (cost=11824.16..11831.55 rows=2956 width=33) (actual time=248.17..248.17 rows=0 loops=1) Sort Key: order_date -> Index Scan using transactions_pop_i on transactions (cost=0.00..11653.79 rows=2956 width=33) (actual time=126.13..126.13 rows=0 loops=1) Index Cond: (upper((pop)::text) = '79BCDC8A4A4F99E7C111111111111111'::text) Total runtime: 248.25 msec Thank you, Alexandra