X-Original-To: pgsql-performance-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 784825294D for ; Tue, 28 Jun 2005 01:29:48 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 08105-09 for ; Tue, 28 Jun 2005 04:29:46 +0000 (GMT) Received: from smtp003.bizmail.yahoo.com (smtp003.bizmail.yahoo.com [216.136.130.195]) by svr1.postgresql.org (Postfix) with SMTP id 2675A52949 for ; Tue, 28 Jun 2005 01:29:45 -0300 (ADT) Received: from unknown (HELO ?192.168.3.41?) (david.mitchell@telogis.com@203.98.10.169 with plain) by smtp003.bizmail.yahoo.com with SMTP; 28 Jun 2005 04:29:41 -0000 Message-ID: <42C0D22C.6060609@telogis.com> Date: Tue, 28 Jun 2005 16:29:32 +1200 From: David Mitchell User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Gnanavel Shanmugam Cc: pgsql-performance@postgresql.org Subject: Re: How can I speed up this function? References: <96ACC448E50.000007FCs.gnanavel@inbox.com> In-Reply-To: <96ACC448E50.000007FCs.gnanavel@inbox.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at hub.org X-Archive-Number: 200506/527 X-Sequence-Number: 13164 Hi Gnanavel, Thanks, but that will only return at most 100 statements. If there is a transaction with 110 statements then this will not return all the statements for that transaction. We need to make sure that the function returns all the statements for a transaction. Cheers David Gnanavel Shanmugam wrote: > Merge the two select statements like this and try, > > SELECT t.trans_id as ID,s.id, s.transaction_id, s.table_name, s.op, s.data > FROM pending_trans AS t join dbmirror.pending_statement AS s > on (s.transaction_id=t.id) > WHERE t.fetched = false order by t.trans_id,s.id limit 100; > > If the above query works in the way you want, then you can also do the > update > using the same. > > with regards, > S.Gnanavel > > > >>-----Original Message----- >>From: david.mitchell@telogis.com >>Sent: Tue, 28 Jun 2005 14:37:34 +1200 >>To: pgsql-performance@postgresql.org >>Subject: [PERFORM] How can I speed up this function? >> >>We have the following function in our home grown mirroring package, but >>it isn't running as fast as we would like. We need to select statements >>from the pending_statement table, and we want to select all the >>statements for a single transaction (pending_trans) in one go (that is, >>we either select all the statements for a transaction, or none of them). >>We select as many blocks of statements as it takes to top the 100 >>statement limit (so if the last transaction we pull has enough >>statements to put our count at 110, we'll still take it, but then we're >>done). >> >>Here is our function: >> >>CREATE OR REPLACE FUNCTION dbmirror.get_pending() >> RETURNS SETOF dbmirror.pending_statement AS >>$BODY$ >> >>DECLARE >> count INT4; >> transaction RECORD; >> statement dbmirror.pending_statement; >> BEGIN >> count := 0; >> >> FOR transaction IN SELECT t.trans_id as ID >> FROM pending_trans AS t WHERE fetched = false >> ORDER BY trans_id LIMIT 50 >> LOOP >> update pending_trans set fetched = true where trans_id = >>transaction.id; >> >> FOR statement IN SELECT s.id, s.transaction_id, s.table_name, s.op, >>s.data >> FROM dbmirror.pending_statement AS s >> WHERE s.transaction_id = transaction.id >> ORDER BY s.id ASC >> LOOP >> count := count + 1; >> >> RETURN NEXT statement; >> END LOOP; >> >> IF count > 100 THEN >> EXIT; >> END IF; >> END LOOP; >> >> RETURN; >> END;$BODY$ >> LANGUAGE 'plpgsql' VOLATILE; >> >>Table Schemas: >> >>CREATE TABLE dbmirror.pending_trans >>( >> trans_id oid NOT NULL, >> fetched bool DEFAULT false, >> CONSTRAINT pending_trans_pkey PRIMARY KEY (trans_id) >>) >>WITHOUT OIDS; >> >>CREATE TABLE dbmirror.pending_statement >>( >> id oid NOT NULL DEFAULT nextval('dbmirror.statement_id_seq'::text), >> transaction_id oid NOT NULL, >> table_name text NOT NULL, >> op char NOT NULL, >> data text NOT NULL, >> CONSTRAINT pending_statement_pkey PRIMARY KEY (id) >>) >>WITHOUT OIDS; >> >>CREATE UNIQUE INDEX idx_stmt_tran_id_id >> ON dbmirror.pending_statement >> USING btree >> (transaction_id, id); >> >>Postgres 8.0.1 on Linux. >> >>Any Help would be greatly appreciated. >> >>Regards >> >>-- >>David Mitchell >>Software Engineer >>Telogis >> >>---------------------------(end of broadcast)--------------------------- >>TIP 8: explain analyze is your friend -- David Mitchell Software Engineer Telogis