Re: Much Ado About COUNT(*)

Поиск
Список
Период
Сортировка
От Richard Huxton
Тема Re: Much Ado About COUNT(*)
Дата
Msg-id 41EFA7B4.2090103@archonet.com
обсуждение исходный текст
Ответ на Re: Much Ado About COUNT(*)  ("D'Arcy J.M. Cain" <darcy@druid.net>)
Ответы Re: Much Ado About COUNT(*)
Список pgsql-hackers
D'Arcy J.M. Cain wrote:
> On Thu, 20 Jan 2005 10:12:17 -0000
> "Mark Cave-Ayland" <m.cave-ayland@webbased.co.uk> wrote:
> 
>>Thanks for the information. I seem to remember something similar to
>>this being discussed last year in a similar thread. My only real issue
>>I can see with this approach is that the trigger is fired for every
>>row, and it is likely that the database I am planning will have large
>>inserts of several hundred thousand records. Normally the impact of
>>these is minimised by inserting the entire set in one transaction. Is
>>there any way that your trigger can be modified to fire once per
>>transaction with the number of modified rows as a parameter?
> 
> 
> I don't believe that such a facility exists but before dismissing it you
> should test it out.  I think that you will find that disk buffering (the
> system's as well as PostgreSQL's) will effectively handle this for you
> anyway.

Well, it looks like ROW_COUNT isn't set in a statement-level trigger 
function (GET DIAGNOSTICS myvar=ROW_COUNT). Which is a shame, otherwise 
it would be easy to handle. It should be possible to expose this 
information though, since it gets reported at the command conclusion.

--  Richard Huxton  Archonet Ltd

-- stmt_trig_test.sql --
BEGIN;

CREATE TABLE trigtest (    a int4 NOT NULL,    b text,    PRIMARY KEY (a)
);

CREATE FUNCTION tt_test_fn() RETURNS TRIGGER AS '
DECLARE    nr integer;    ro integer;    nr2 integer;
BEGIN    GET DIAGNOSTICS nr = ROW_COUNT;    GET DIAGNOSTICS ro = RESULT_OID;    SELECT count(*) INTO nr2 FROM
trigtest;
    RAISE NOTICE ''nr = % / ro = % / nr2 = %'',nr,ro,nr2;
    RETURN NULL;
END;
' LANGUAGE plpgsql;

CREATE TRIGGER tt_test AFTER INSERT OR UPDATE ON trigtest
FOR EACH STATEMENT
EXECUTE PROCEDURE tt_test_fn();

INSERT INTO trigtest VALUES (1,'a');
INSERT INTO trigtest VALUES (2,'b');
UPDATE trigtest SET b = 'x';

ROLLBACK;


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Neil Conway
Дата:
Сообщение: Re: ARC patent
Следующее
От: Robert Treat
Дата:
Сообщение: Re: Two-phase commit for 8.1