Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb246510

Browse files
committed
Avoid O(N^2) behavior in deferredTriggerAddEvent() for large numbers of
tuples inserted/deleted/updated in a single transaction. On my machine,this reduced the time to delete 80000 tuples in a foreign-key-referencingtable from ~15min to ~8sec.
1 parent74c732c commitb246510

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

‎src/backend/commands/trigger.c

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.86 2001/01/27 05:16:58 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.87 2001/03/12 23:02:00 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -1152,14 +1152,16 @@ static bool deftrig_all_isdeferred;
11521152
staticList*deftrig_trigstates;
11531153

11541154
/* ----------
1155-
* The list of events during the entire transaction.
1155+
* The list of events during the entire transaction. deftrig_events
1156+
* is the head, deftrig_event_tail is the last entry.
11561157
*
1157-
* XXXThis must finallybeheld ina filebecause of the huge
1158-
*number of events that could occur in the real world.
1158+
* XXXNeed tobeable to shove this data out toa fileif it grows too
1159+
*large...
11591160
* ----------
11601161
*/
11611162
staticintdeftrig_n_events;
11621163
staticList*deftrig_events;
1164+
staticList*deftrig_event_tail;
11631165

11641166

11651167
/* ----------
@@ -1235,7 +1237,22 @@ deferredTriggerCheckState(Oid tgoid, int32 itemstate)
12351237
staticvoid
12361238
deferredTriggerAddEvent(DeferredTriggerEventevent)
12371239
{
1238-
deftrig_events=lappend(deftrig_events,event);
1240+
/*
1241+
* Since the event list could grow quite long, we keep track of the
1242+
* list tail and append there, rather than just doing a stupid "lappend".
1243+
* This avoids O(N^2) behavior for large numbers of events.
1244+
*/
1245+
if (deftrig_event_tail==NIL)
1246+
{
1247+
/* first list entry */
1248+
deftrig_events=makeList1(event);
1249+
deftrig_event_tail=deftrig_events;
1250+
}
1251+
else
1252+
{
1253+
lnext(deftrig_event_tail)=makeList1(event);
1254+
deftrig_event_tail=lnext(deftrig_event_tail);
1255+
}
12391256
deftrig_n_events++;
12401257
}
12411258

@@ -1397,7 +1414,6 @@ deferredTriggerInvokeEvents(bool immediate_only)
13971414
List*el;
13981415
DeferredTriggerEventevent;
13991416
intstill_deferred_ones;
1400-
inteventno=-1;
14011417
inti;
14021418
MemoryContextper_tuple_context;
14031419

@@ -1421,8 +1437,6 @@ deferredTriggerInvokeEvents(bool immediate_only)
14211437

14221438
foreach(el,deftrig_events)
14231439
{
1424-
eventno++;
1425-
14261440
MemoryContextReset(per_tuple_context);
14271441

14281442
/* ----------
@@ -1548,6 +1562,7 @@ DeferredTriggerBeginXact(void)
15481562

15491563
deftrig_n_events=0;
15501564
deftrig_events=NIL;
1565+
deftrig_event_tail=NIL;
15511566
}
15521567

15531568

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp