Received: from localhost (unknown [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id BED659FB51D for ; Wed, 10 Oct 2007 11:45:55 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 72252-02-2 for ; Wed, 10 Oct 2007 11:45:38 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.5 Received: from flame.co.za (sharon.co.za [160.124.170.1]) by postgresql.org (Postfix) with ESMTP id 8ACAC9FB61E for ; Wed, 10 Oct 2007 11:45:37 -0300 (ADT) Received: from [192.168.0.161] (unknown [196.209.202.75]) (using TLSv1 with cipher RC4-MD5 (128/128 bits)) (No client certificate requested) by flame.co.za (Postfix) with ESMTP id 564E1800CE for ; Wed, 10 Oct 2007 16:45:33 +0200 (SAST) Subject: Performance problems with prepared statements From: Theo Kramer Reply-To: theo@flame.co.za To: pgsql-performance@postgresql.org Content-Type: text/plain Organization: Flame Computing Enterprises cc Date: Wed, 10 Oct 2007 16:45:40 +0200 Message-Id: <1192027540.2495.3.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.10.3 (2.10.3-4.fc7) Content-Transfer-Encoding: 7bit X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200710/95 X-Sequence-Number: 27117 Hi I have been having some serious performance issues when using prepared statements which I can not re-produce when using a direct statement. Let me try to explain The query does an order by in descending order on several columns for which an index exists. The explain output as follows rascal=# explain SELECT oid, * FROM calllog WHERE calllog_mainteng = '124 ' AND calllog_phase = 8 AND calllog_self < 366942 OR calllog_mainteng = '124 ' AND calllog_phase < 8 ORDER BY calllog_mainteng DESC, calllog_phase DESC, calllog_self DESC limit 25; QUERY PLAN --------------------------------------------------------------------------------------------------------- Limit (cost=0.00..111.62 rows=25 width=2164) -> Index Scan Backward using calllog_rmc_idx on calllog (cost=0.00..53475.22 rows=11977 width=2164) Index Cond: (calllog_mainteng = '124 '::bpchar) Filter: (((calllog_phase = 8) AND (calllog_self < 366942)) OR (calllog_phase < 8)) When running the query directly from psql it returns the required rows in less than 100 milli-seconds. However, when using a prepared statement from my C application on the above query and executing it the query duration is as follows SELECT oid, * FROM calllog WHERE calllog_mainteng = '124 ' AND calllog_phase = 8 AND calllog_self < 366942 OR calllog_mainteng = '124 ' AND calllog_phase < 8 ORDER BY calllog_mainteng DESC, calllog_phase DESC, calllog_self DESC limit 25 Row[s] = 25, Duration = 435409.474 ms The index as per the explain is defined as follows "calllog_rmc_idx" UNIQUE, btree (calllog_mainteng, calllog_phase, calllog_self) VACUUM and all those good things done Version of PostgreSQL 8.1 and 8.2 enable_seqscan = off enable_sort = off Any advice/suggestions/thoughts much appreciated -- Regards Theo