Re: Problems requiring a GROUP BY clause on update?

From: Joshua Moore-Oliva <josh(at)chatgris(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Problems requiring a GROUP BY clause on update?
Date: 2003-09-17 23:42:47
Message-ID: 200309171942.47966.josh@chatgris.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

I am attempting to find out how many rows a query operation affected, then
update a separate row to keep count, because running a SELECT COUNT(id) FROM
lists is far too slow when there are millions of records and the number if
required for a user interface.

So far my only success has only come from making functions for each operation,
and using GET DIAGNOSTICS num_affected := ROW_COUNT;

I don't want triggers to update one at a time because I at times insert
millions of rows, and don't think that millions of update statements is too
healthy :).

Thanks, Josh.

On September 17, 2003 11:23 am, Tom Lane wrote:
> Joshua Moore-Oliva <josh(at)chatgris(dot)com> writes:
> > Attribute lists.list_size_active must be GROUPed or used in an aggregate
> > function
> >
> > CREATE OR REPLACE RULE items_log_insert AS ON INSERT
> > TO listdb.list_items
> > WHERE NEW.active = 1 DO (
> > UPDATE lists SET
> > list_size_active = list_size_active + COUNT( NEW.active )
> > WHERE list_id = NEW.list_id;
> > );
>
> The error message isn't really helpful, perhaps, but I think the system
> is quite right to squawk. What do you expect that command to do? The
> COUNT() is completely meaningless because there isn't anything for it
> to iterate over. (The SQL spec forbids aggregate functions in UPDATE
> lists altogether, and I rather think they are right, though we've not
> yet got around to installing that specific error check.)
>
> Possibly what you want is some kind of sub-select:
>
> UPDATE lists SET
> list_size_active = list_size_active +
> (SELECT COUNT(*) FROM ... WHERE ...)
> WHERE list_id = NEW.list_id;
>
> but I can't help you with what to put for "..." because you've not made
> it clear what you are trying to achieve.
>
> It's also entirely likely that you'd find an ON INSERT trigger to be
> easier to work with than a rule. People frequently try to force rules
> to behave like per-tuple actions, but they almost always lose the
> battle. A rule is a query-level transformation, and it requires a
> different mindset to use effectively.
>
> regards, tom lane

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Robert Wille 2003-09-18 00:47:30 Re: Sort order is different on Windows and Linux
Previous Message Stephan Szabo 2003-09-17 23:27:36 Re: Sort order is different on Windows and Linux