Re: [GENERAL] 7.4Beta

From: Andreas Pflug <pgadmin(at)pse-consulting(dot)de>
To: Stephan Szabo <sszabo(at)megazone(dot)bigpanda(dot)com>
Cc: PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: [GENERAL] 7.4Beta
Date: 2003-08-15 17:20:48
Message-ID: 3F3D1670.2040209@pse-consulting.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

Stephan Szabo wrote:

>On Fri, 15 Aug 2003, Andreas Pflug wrote:
>
>
>
>>Stephan Szabo wrote:
>>
>>
>>
>>>On Fri, 15 Aug 2003, Andreas Pflug wrote:
>>>
>>>
>>>
>>>
>>>
>>>>Stephan Szabo wrote:
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>>That really needs to be rewritten to do a single check over the table
>>>>>rather than running the constraint for every row. I keep meaning to get
>>>>>around to it and never actually do. :( I'm not sure that in practice
>>>>>you'll get a better plan at restore time depending on what the default
>>>>>statistics give you.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>This is clearly a case for a statement level trigger, as soon as
>>>>affected rows can be identified.
>>>>
>>>>
>>>>
>>>>
>>>Well, I think single inserts might be more expensive (because the query is
>>>more involved for the table joining case) using a statement level trigger,
>>>so we'd probably want to profile the cases.
>>>
>>>
>>>
>>>
>>This really depends. If a constraint is just a check on the
>>inserted/updated column, so no other row needs to be checked, there's no
>>faster way then the current row trigger. But FK constraints need to
>>execute a query to retrieve the referenced row, and every RDBMS prefers
>>to execute a single statement with many rows over many statements with a
>>single row, because the first will profit from optimization. And even if
>>only a single row is inserted or updated, there's still the need to
>>lookup the reference.
>>
>>
>
>I don't think that addresses the issue I brought up. If you're doing a
>bunch of single inserts:
>begin;
>insert into foo values (1);
>insert into foo values (1);
>insert into foo values (1);
>insert into foo values (1);
>insert into foo values (1);
>end;
>
>Each of those statement triggers is still only going to be dealing with a
>single row. If you're in immediate mode there's not much you can do about
>that since the constraint is checked between inserts. If you're in
>deferred mode, right now it won't help because it's not going to batch
>them, it's going to be 5 statement triggers AFAICT each with its own 1 row
>affected table.
>
>I believe that the more complicated join the old/new table with the pk
>table and do the constraint check is going to be slightly slower than the
>current row behavior for such cases because the trigger query is going to
>be more complicated. What would be nice would be some way to choose
>whether to use a single query per statement vs a simpler query per row
>based on what's happening.
>
>
>

Deferring the constraint check would mean checking 5 single rows, right.
But I still can't see why you think that a row level trigger would be
cheaper in this case. I had a look at ri_triggers.c and what's coded
there looks just as I expected, doing a query on the referenced table.
the queries might look a bit different when checking multiple rows at
once, but carefully designed I doubt that there would be a performance
hit from this. In case it *is* significantly slower, single row updates
could be handled separately using the current triggers, and statement
triggers for multiple rows. This would cover both scenarios best. At the
moment, update/insert scales not too good.

Best thing in the situation above would certainly be if all 5 rows would
be checked in a single query, but that looks quite impossible because a
mixture of inserts/updates/deletes on different tables might be deferred.

Regards,
Andreas

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Williams, Travis L 2003-08-15 17:25:59 Re: New to list, quick question.
Previous Message expect 2003-08-15 17:18:44 summary and request

Browse pgsql-hackers by date

  From Date Subject
Next Message Stephan Szabo 2003-08-15 17:31:21 Re: [GENERAL] 7.4Beta
Previous Message Jan Wieck 2003-08-15 17:13:06 Re: [GENERAL] 7.4Beta