powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SAVEPOINT в ХП
29 сообщений из 29, показаны все 2 страниц
SAVEPOINT в ХП
    #33659098
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем! Вопрос такой: имеется ХП с куском кода внутри вида
...
for i in select * from table_1
loop
insert into table_2 (id,name) values (i.id,i.name);
end loop;
...
Если table_1 достаточно велика, то ХП выполняется продолжительное время. Если table_1 активно используемая таблица, то ХП начинает лочить другие запросы. Никак не могу найти вразумительного описания, возможно ли использование savepoint в виде
...
for i in select * from table_1
loop
insert into table_2 (id,name) values (i.id,i.name);
SAVEPOINT p_1;
end loop;
...
для решения моей проблемы?
Иными словами: ХП выполняется долго, лочит другие транзакции, нужно сделать, чтобы и другие запросы работали. Возможно ли это сделать с помощью SAVEPOINT?
Заранее спасибо.
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33659158
.Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я чего-то, наверное, не понимаю. Каким образом возникла мысль, что Savepoint может помочь в такой ситуации? ;)
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33659307
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да были, конечно, смутные сомнения, что это не из той оперы, но не было определенности. Значит, не поможет? Выход - вынести цикл во вне ХП или есть что-то более изящное?
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33659442
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
insert into table_2 (id, name)
select id,name from table_1;
А разве так не работает?
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33660369
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело не в том, работает или нет. Дело в том, что лочит, если table_1 большая и частоиспользуемая. А нужно чтобы всем было хорошо. Кроме того, пример утрирован. На самом деле в ХП на одной итерации делается несколько select и insert :)
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33661768
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOmniДело не в том, работает или нет. Дело в том, что лочит, если table_1 большая и частоиспользуемая. А нужно чтобы всем было хорошо. Кроме того, пример утрирован. На самом деле в ХП на одной итерации делается несколько select и insert :)

Может из за ключей лочится таблица? Ваще можно структуру таблицы ?
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33661867
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, структуру раскрыть не могу. Но ключи (ИМХО, разумеется) тут не при чем. При чем тут то, что таблица активно update-ится / insert-ится / select-ится, а тут ее лочит одна очень долгая транзакция. Да я уже вынес цикл во вне, так что моя конкретная проблема решена (может, не совсем изящно, но другого способа не нашел). Можно, видимо, подумать еще что-то с уровнями изоляции, но заморочки не стоят эффекта, думается мне...
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33662167
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще (насколько я понимаю) в postgres не явно можно залочить только попыткой конурирующего апдейта одной строки (или select for update, или select for share + select for update или update)
Правда еще была заморочка с foreign key, утверждают, что исправили.

В любом случае - транзакция, делающая только select по таблице, не может лочит эту таблицу, если никто не пытается использовать явный lock table ... in mode ... . Видимо лочатся другие таблицы.
Я могу ошибаться - почему вы думаете, что залочена именно эта таблица (table_1)?
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33662174
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_FalconВообще (насколько я понимаю) в postgres не явно можно залочить только попыткой конурирующего апдейта одной строки (или select for update, или select for share + select for update или update)
Правда еще была заморочка с foreign key, утверждают, что исправили.

В любом случае - транзакция, делающая только select по таблице, не может лочит эту таблицу, если никто не пытается использовать явный lock table ... in mode ... . Видимо лочатся другие таблицы.
Я могу ошибаться - почему вы думаете, что залочена именно эта таблица (table_1)?

А с ключами что правда исправили??!?!?
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33662354
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я могу ошибаться - почему вы думаете, что залочена именно эта таблица (table_1)?
Хммм... и правда. Хотя, возможность залочки других важных таблиц крайне мала. Вообще, дейсвия такие (прошу прощения, что сразу не описал должным образом):
for i in select * from table_1
loop
insert into j count(*) as cnt from MEGA_TABLE where id_1=i.id and ещё много всего
if j.cnt>1 then
insert into table_a (j.cnt,...);
end if;
insert into j count(*) as cnt from MEGA_TABLE where id_1=i.id and ещё много всего другого
if j.cnt>1 then
insert into table_b (j.cnt,...);
end if;
......................
end if;
end loop;
Так вот эти самые table_a, table_b - это редко используемые справочники. В это время клиенты начинают делать insert into MEGA_TABLE, на on_insert которой стоит в том числе update table_1. Т.к. все эти клиенты подвисают, а по ps ax | grep postgre видим застопорившиеся соединения (в различных стадиях), то делаю вывод, что лочится либо table_1 либо MEGA_TABLE.
------------------
Структуру, триггеры и ХП не могу предоставить не только потому, что проект коммерческий и у меня договор, но и потому, что там очень много всего, разбираться будет невозможно или лень. Уж лучше попробовать на таких абстракциях, мне кажется...
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33662361
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВАХ-ВАХ, опечатка, конечно же :) всё выглядит так (в ХП insert = select):
----------
Я могу ошибаться - почему вы думаете, что залочена именно эта таблица (table_1)?
Хммм... и правда. Хотя, возможность залочки других важных таблиц крайне мала. Вообще, дейсвия такие (прошу прощения, что сразу не описал должным образом):
for i in select * from table_1
loop
select into j count(*) as cnt from MEGA_TABLE where id_1=i.id and ещё много всего
if j.cnt>1 then
insert into table_a (j.cnt,...);
end if;
select into j count(*) as cnt from MEGA_TABLE where id_1=i.id and ещё много всего другого
if j.cnt>1 then
insert into table_b (j.cnt,...);
end if;
......................
end if;
end loop;
Так вот эти самые table_a, table_b - это редко используемые справочники. В это время клиенты начинают делать insert into MEGA_TABLE, на on_insert которой стоит в том числе update table_1. Т.к. все эти клиенты подвисают, а по ps ax | grep postgre видим застопорившиеся соединения (в различных стадиях), то делаю вывод, что лочится либо table_1 либо MEGA_TABLE.
------------------
Структуру, триггеры и ХП не могу предоставить не только потому, что проект коммерческий и у меня договор, но и потому, что там очень много всего, разбираться будет невозможно или лень. Уж лучше попробовать на таких абстракциях, мне кажется...
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33662444
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробовал конкретно локи посмотреть?

есть такая табличка (или вьюшка) называется pg_locks

в ней даже написано лочит одна транзакция другую или нет..

есть еще табличка pg_stat_activity в ней текущие запросы..

это все можно заджойнить с pg_class
и ты точно узнаеш.. лочится что то или у тебя винт проседает.
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33665276
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wbear дело говорит.


on_insert которой стоит в том числе update table_1
Так если два клиента пытаются апдейтить одну строку, то второй залочиться, пока первый не с коммититься/откатнется. А если он еще кого-то ждет, то и получаем.

А соединение, где этот цикл пашет, точно не трогает table_1 кроме как для селекта? Или может оно еще где строку апдейтит, которую другие тож пытаются ? Тогда и получится - dead lock-а нет, а все ждет наш цикл.

PS.
Правда еще была заморочка с foreign key, утверждают, что исправили.

- в версии 8.1 введен shared lock на строку (в частности появилось select for share) - за счет этого и foreing keys разлочились :-) говорят ...
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33667102
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_Falcon wbear дело говорит.


on_insert которой стоит в том числе update table_1
Так если два клиента пытаются апдейтить одну строку, то второй залочиться, пока первый не с коммититься/откатнется. А если он еще кого-то ждет, то и получаем.

А соединение, где этот цикл пашет, точно не трогает table_1 кроме как для селекта? Или может оно еще где строку апдейтит, которую другие тож пытаются ? Тогда и получится - dead lock-а нет, а все ждет наш цикл.

одну строку они не должны трогать, т.к. ХП работает с уже отработанными записями, т.е. которые не подлежат изменению (это прописано в условии ... from MEGA_TABLE where ...), причем за вчера. Когда делается insert into MEGA_TABLE, то это происходит сегодня и не должно удовлетворить условию where...
Что касается вышеуказанных таблиц, то сейчас на них смотрю, но пока ничего не понимаю :)
Если лочивший запрос можно увидеть в pg_stat_activity.current_query, так там у меня везде <command string not enabled>, а вообще интересно, конечно... буду ковырять...
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33667139
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S. винт вряд ли проседает, ибо своп не юзается... или это не связано?
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33667250
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
своп почти на 100% тут не причем...
просто ты пытаешся выяснить что чем лочится при этом есть только догадка что что-то чем то лочится.. а ты в этом уверен прям на 100%?
это всеравно что говорить.. "оно должно использоват индекс и работать быстро, а оно работает медленно" при этом даж не заглянув в explain..

мож у тебя какой-нить вакум ее лочит.. или еще чтонить про что ты забыл..
посмотри в pg_locks найди запрос который залочен и посмотри запросы которые залочили эту таблицу ...мож и вопрос моментально отпадет.

а так годать можно долго...
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33667377
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wbearесть такая табличка (или вьюшка) называется pg_locks


хм. вот сморю у себя дико долго сполняющийся в 7.3. заброс вида
Код: plaintext
1.
INSERT INTO xxx (yyy)
SELECT yyy FROM xxx1
получаю такую инфу о локах
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT l.*,c.relname FROM pg_locks l
INNER join pg_class c ON (relation = c.oid)
WHERE NOT relname IN ('pg_class','pg_locks');
----
 2267950 ; 1978232 ;; 3461 ;"AccessShareLock";t;"acc_kassaj_j1prikhodnyej_orderaj1_heap"
 2269228 ; 1978232 ;; 3461 ;"AccessShareLock";t;"acc_kassaj_j1prikhodnyej_orderaj1_numbloaded_seq"
 2269230 ; 1978232 ;; 3461 ;"AccessShareLock";t;"acc_kassaj_j1prikhodnyej_orderaj1"
 2269230 ; 1978232 ;; 3461 ;"RowExclusiveLock";t;"acc_kassaj_j1prikhodnyej_orderaj1"
(не пугайтесь - имена получены афто-матом прогой транслита имен табличек внешнего приложения). И вот с такими локами запрос уходит в совершенно космические времена.
(унутре у нее неонка - в триггере бефоре инсерт идет проверка всех вставляемых полей (а поскоку IS DISTINCT FROM в 7.3. в процедурах наворачиваецца, то гробоватыми конструкциями) и, затем, либо RETURN NULL, либо UPDATE (поля "actual" другой записи) +RETURN NEW, либо проосто RETURN NEW. и всего 8000 записей "впендюливаюцца" у меня (сейчас) уже дольше 1500 секунд (одна запись ~ 20-ки милисекунд) И с чем это можно связать? Картина блокировок практицки не меняецца (порядок разве что).
сижу и чешу репу. - по смыслу и триггер и набор записей таков, что дважды запись меняцца не может. т.е., кажецца, должен итти линейный рост времени с ростом числа "вставляемых" записев. Ну разве уникальный индекс есь в таблитце назначения. Но я вставляю в тесте уже ранее вставленный набор, для которого вообще должно всегда быть RETURN NULL; - т.е. ваще ничего не должно перестраивацца.
И чо еще можно проверить? (наверное придецца вернуться к варианту без UPDATE - с отдельной табличкой актуальных ключей) Там, вродеба, не было такого напряга.
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33667387
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: дождался
Query returned successfully: 0 rows affected, 1977031 ms execution time.
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33667646
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавил лишнюю та-блитцу (шобы не апдейтить длинные записи, значица, а ключики онли)
получил
Query returned successfully: 0 rows affected, 1159312 ms execution time.мдя-с. кажецца в кансерватории чото нада минять. буду пробовать пес триккеров - одной ха-пой (при большом кол-ве совпадений должно полегчать?). кхммм.
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33667820
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wbearсвоп почти на 100% тут не причем...
просто ты пытаешся выяснить что чем лочится при этом есть только догадка что что-то чем то лочится.. а ты в этом уверен прям на 100%?
это всеравно что говорить.. "оно должно использоват индекс и работать быстро, а оно работает медленно" при этом даж не заглянув в explain..

мож у тебя какой-нить вакум ее лочит.. или еще чтонить про что ты забыл..
посмотри в pg_locks найди запрос который залочен и посмотри запросы которые залочили эту таблицу ...мож и вопрос моментально отпадет.

а так годать можно долго...
Да я ж говорю, что там не видно, то за запрос лочит (или я еще не научился, как)...
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33668011
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а это чаво тада -враки?

PgDoc8
ACCESS SHARE
Conflicts with the ACCESS EXCLUSIVE lock mode only.

The commands SELECT and ANALYZE acquire a lock of this mode on referenced tables. In general, any query that only reads a table and does not modify it will acquire this lock mode.

.........

ACCESS EXCLUSIVE
Conflicts with locks of all modes (ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, and ACCESS EXCLUSIVE). This mode guarantees that the holder is the only transaction accessing the table in any way.

Acquired by the ALTER TABLE, DROP TABLE, REINDEX, CLUSTER, and VACUUM FULL commands. This is also the default lock mode for LOCK TABLE statements that do not specify a mode explicitly.


Tip
Only an ACCESS EXCLUSIVE lock blocks a SELECT (without FOR UPDATE/SHARE) statement.




ну мож инсерт неявно индекс ковыряет и никому не говорит об этом..
но энто бред помойму... или я вообще чего-то не понимаю.
:/
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33668134
SOmni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мож опция какая не включена...
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33668289
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 Query returned successfully: 0 rows affected, 1159312 ms execution time.мдя-с. кажецца в кансерватории чото нада минять. буду пробовать пес триккеров - одной ха-пой (при большом кол-ве совпадений должно полегчать?). кхммм.
оффтоп. простой хапой в LOOP-е палучилась ~200-300 сек - просто сэмулировал вставку и отработку триккера внутри цикла.
Изгитрившись засандалить логику в 2 SQL инсрукции (UPDATE + INSERT ) получилась без LOOP-ы ~3 сек.
Мдя-с. "Парядка 2 туда, парядка 2 сюда".
чёб такое фыппить? /оффтоп.
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33671024
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 оффтоп./оффтоп.на
[оффтоп.]8.1 то же самое, что и в 7.хх, тот же объем:
триггер на кажинную запиздь 130.906 сек
луп по усем запиздям 11.437 сек
скл ф-я 0.513 сек[/оффтоп.]

таки скл на массовую обработку работает на порядок быстрее лупа в плпг, и на более чем 2 порядка шибче триггера на кажную запись (особливо, видимо, когда результат работы практицки пуст). Странно?
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33671453
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вероятно это потому что в хп все запросы по одному и томуже плану выполняются, а когда внешний луп оно новый создает план на каждый запрос который может быть ефективнее первого.
попробуй тожесамое тока в хп через execute запросы выполнять...
заодно проверим мою гипотезу :)
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33671488
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
расшифрую на всякий случай :)

plpgsql строит по первому запросу (с первыми where ....) план..запоминает его..
если это неудачный случай.. например секскан ..то естественно все остальные запросы (этиже запросы в этой сесии но с другими константами) идут тоже сексканом .. хотя при этом вполне возможно что среди этих запросов может попастся такой запрос ,(ели построить новый план по которому будет), то он бы юзал индекс и выполнялся бы быстрее... а так - "..ку.." (c).



p.s тема ушла в глубокий оофтоп...
p.s 4321 пиши плз яснее, твои посты читать интересно.. но тяжело :)
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33672059
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wbear p.s тема ушла в глубокий оофтоп...
p.s 4321 пиши плз яснее, твои посты читать интересно.. но тяжело :)
да я в офтопе, и об свойом, об дуффичьем.
сципиально раскрою по запросу, шоб было ясно, токо выйдет дюже длинна :
есть таблички ххх_heap - "свалки". куда бросаюцца данные из внешней прилады (аксесс). Есь таблички назначения xxx с версиями, куда это всё попадает. Когда я кидал данные напрямую, (без "свалок"), то кидал простым инсертом, а на инсерт вешал примерно такой триггер (ужастен в силу того, что писался для 7.3., а в нем IS DISTINCT FROM бажит жутко)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
CREATE OR REPLACE FUNCTION ftr_checkreplica_acc_kassaj_j1prikhodnyej_orderaj1()
  RETURNS "trigger" AS
$BODY$
DECLARE	
	_lastold RECORD;
	_isupdated bool;	
	_buf int4;
BEGIN
	select * INTO _lastold 
		FROM acc_kassaj_j1prikhodnyej_orderaj1 AS a
		WHERE a.js = NEW.js
		ORDER BY a.actual, a.numbloaded DESC LIMIT  1 ;

	IF FOUND THEN
		--RAISE NOTICE 'FOUND';

		IF NOT COALESCE(((_lastold.jnj_pj2o= NEW.jnj_pj2o) 
			OR ((_lastold.jnj_pj2o IS NULL) AND (NEW.jnj_pj2o IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.data= NEW.data) 
			OR ((_lastold.data IS NULL) AND (NEW.data IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.vremja= NEW.vremja) 
			OR ((_lastold.vremja IS NULL) AND (NEW.vremja IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.kurs= NEW.kurs) 
			OR ((_lastold.kurs IS NULL) AND (NEW.kurs IS NULL))),FALSE)
				THEN _isupdated = TRUE;
/* --не интересует
		ELSIF NOT COALESCE(((_lastold.debet= NEW.debet) 
			OR ((_lastold.debet IS NULL) AND (NEW.debet IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.kredit= NEW.kredit) 
			OR ((_lastold.kredit IS NULL) AND (NEW.kredit IS NULL))),FALSE)
				THEN _isupdated = TRUE;
--не интересует
 */
		ELSIF NOT COALESCE(((_lastold.klient= NEW.klient) 
			OR ((_lastold.klient IS NULL) AND (NEW.klient IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.poluchateljt= NEW.poluchateljt) 
			OR ((_lastold.poluchateljt IS NULL) AND (NEW.poluchateljt IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.osnovanie= NEW.osnovanie) 
			OR ((_lastold.osnovanie IS NULL) AND (NEW.osnovanie IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.summaj1rj1= NEW.summaj1rj1) 
			OR ((_lastold.summaj1rj1 IS NULL) AND (NEW.summaj1rj1 IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.summaj1jdj1= NEW.summaj1jdj1) 
			OR ((_lastold.summaj1jdj1 IS NULL) AND (NEW.summaj1jdj1 IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.prilozhenie= NEW.prilozhenie) 
			OR ((_lastold.prilozhenie IS NULL) AND (NEW.prilozhenie IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.tipj_dok= NEW.tipj_dok) 
			OR ((_lastold.tipj_dok IS NULL) AND (NEW.tipj_dok IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.jpj_nds= NEW.jpj_nds) 
			OR ((_lastold.jpj_nds IS NULL) AND (NEW.jpj_nds IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.jnscheta= NEW.jnscheta) 
			OR ((_lastold.jnscheta IS NULL) AND (NEW.jnscheta IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.operacija= NEW.operacija) 
			OR ((_lastold.operacija IS NULL) AND (NEW.operacija IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.c_count= NEW.c_count) 
			OR ((_lastold.c_count IS NULL) AND (NEW.c_count IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.c_nakl= NEW.c_nakl) 
			OR ((_lastold.c_nakl IS NULL) AND (NEW.c_nakl IS NULL))),FALSE)
				THEN _isupdated = TRUE;
/*
		ELSIF NOT COALESCE(((_lastold.username= NEW.username) 
			OR ((_lastold.username IS NULL) AND (NEW.username IS NULL))),FALSE)
				THEN _isupdated = TRUE;
*/
		ELSIF NOT COALESCE(((_lastold.c_owner= NEW.c_owner) 
			OR ((_lastold.c_owner IS NULL) AND (NEW.c_owner IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.ndone= NEW.ndone) 
			OR ((_lastold.ndone IS NULL) AND (NEW.ndone IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.lvzaim= NEW.lvzaim) 
			OR ((_lastold.lvzaim IS NULL) AND (NEW.lvzaim IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.paydate= NEW.paydate) 
			OR ((_lastold.paydate IS NULL) AND (NEW.paydate IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.lrewrite= NEW.lrewrite) 
			OR ((_lastold.lrewrite IS NULL) AND (NEW.lrewrite IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.pkoext= NEW.pkoext) 
			OR ((_lastold.pkoext IS NULL) AND (NEW.pkoext IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.nyear= NEW.nyear) 
			OR ((_lastold.nyear IS NULL) AND (NEW.nyear IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.whatorg= NEW.whatorg) 
			OR ((_lastold.whatorg IS NULL) AND (NEW.whatorg IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.nnew= NEW.nnew) 
			OR ((_lastold.nnew IS NULL) AND (NEW.nnew IS NULL))),FALSE)
				THEN _isupdated = TRUE;
/*
		ELSIF NOT COALESCE(((_lastold.newcode= NEW.newcode) 
			OR ((_lastold.newcode IS NULL) AND (NEW.newcode IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.ehkspeditor= NEW.ehkspeditor) 
			OR ((_lastold.ehkspeditor IS NULL) AND (NEW.ehkspeditor IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.lehkspeditor= NEW.lehkspeditor) 
			OR ((_lastold.lehkspeditor IS NULL) AND (NEW.lehkspeditor IS NULL))),FALSE)
				THEN _isupdated = TRUE;
*/
		ELSIF NOT COALESCE(((_lastold.c_currency= NEW.c_currency) 
			OR ((_lastold.c_currency IS NULL) AND (NEW.c_currency IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.jpnsp= NEW.jpnsp) 
			OR ((_lastold.jpnsp IS NULL) AND (NEW.jpnsp IS NULL))),FALSE)
				THEN _isupdated = TRUE;
/*
		ELSIF NOT COALESCE(((_lastold.dov_n= NEW.dov_n) 
			OR ((_lastold.dov_n IS NULL) AND (NEW.dov_n IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_data= NEW.dov_data) 
			OR ((_lastold.dov_data IS NULL) AND (NEW.dov_data IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_dni= NEW.dov_dni) 
			OR ((_lastold.dov_dni IS NULL) AND (NEW.dov_dni IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_summa= NEW.dov_summa) 
			OR ((_lastold.dov_summa IS NULL) AND (NEW.dov_summa IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_ehkspeditor= NEW.dov_ehkspeditor) 
			OR ((_lastold.dov_ehkspeditor IS NULL) AND (NEW.dov_ehkspeditor IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_type= NEW.dov_type) 
			OR ((_lastold.dov_type IS NULL) AND (NEW.dov_type IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.makedate= NEW.makedate) 
			OR ((_lastold.makedate IS NULL) AND (NEW.makedate IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.updatedate= NEW.updatedate) 
			OR ((_lastold.updatedate IS NULL) AND (NEW.updatedate IS NULL))),FALSE)
				THEN _isupdated = TRUE;
*/
		END IF;

		--RAISE NOTICE '_isupdated %',_isupdated;
		--RAISE NOTICE 'lastold.c_type IS NULL %',_lastold.c_type;
		IF _isupdated = TRUE THEN
			--скинем флаг предыдущей актуальной
			UPDATE acc_kassaj_j1prikhodnyej_orderaj1 
				SET actual=  0 
				WHERE acc_kassaj_j1prikhodnyej_orderaj1.js = NEW.js
				AND acc_kassaj_j1prikhodnyej_orderaj1.actual= - 1 ;
			-- 
			RETURN NEW; --вставка новой актуальной версии
		ELSE
			--обновляем старое, если помечена как удаленная
			UPDATE acc_kassaj_j1prikhodnyej_orderaj1 
				SET actual= -  1 
			WHERE acc_kassaj_j1prikhodnyej_orderaj1.numbloaded =  _lastold.numbloaded
			AND actual=  0 ;
			_buf:= f_set_acc_kassaj_j1prikhodnyej_orderaj1_numbloaded_seq();
			RETURN NULL;--отказываемся от вставки			
		END IF;
	ELSE
		--вставка новой актуальной записи
		RETURN NEW;
	END IF;	
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
(понятно, что длинная гробовая часть выполняет ROW(.....) IS DISTINCT ROW(...)
вот с ней все улетат в космаз. по вермени. в 1000-и секунд на 7.3 и в 100-ни - на 8.1. (можно переписать дистинкт компактно - для 8-ки, но незачем)
вставка в тесте велась из свалки - acc_kassaj_j1prikhodnyej_orderaj1_heap.

теперь, если вместо инсерта вести вставку хранимкой, внутри которой находится то, что написано в триггере (чтобы было понятно - приведу текст : но боюса, читать его будет лень )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
CREATE OR REPLACE FUNCTION f_acc_kassaj_j1prikhodnyej_orderaj1_add_checkreplica()
  RETURNS void AS
$BODY$
DECLARE	
	h RECORD;
	_lastold RECORD;
	_isupdated bool;	
	_buf int4;
BEGIN
FOR h IN SELECT * FROM acc_kassaj_j1prikhodnyej_orderaj1_heap LOOP
	select * INTO _lastold 
		FROM acc_kassaj_j1prikhodnyej_orderaj1 AS a
		WHERE a.js = h.js
		ORDER BY a.actual, a.numbloaded DESC LIMIT  1 ;

	IF FOUND THEN
		--RAISE NOTICE 'FOUND';
		_isupdated:= 0 ;
		IF NOT COALESCE(((_lastold.jnj_pj2o= h.jnj_pj2o) 
			OR ((_lastold.jnj_pj2o IS NULL) AND (h.jnj_pj2o IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.data= h.data) 
			OR ((_lastold.data IS NULL) AND (h.data IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.vremja= h.vremja) 
			OR ((_lastold.vremja IS NULL) AND (h.vremja IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.kurs= h.kurs) 
			OR ((_lastold.kurs IS NULL) AND (h.kurs IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.debet= h.debet) 
			OR ((_lastold.debet IS NULL) AND (h.debet IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.kredit= h.kredit) 
			OR ((_lastold.kredit IS NULL) AND (h.kredit IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.klient= h.klient) 
			OR ((_lastold.klient IS NULL) AND (h.klient IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.poluchateljt= h.poluchateljt) 
			OR ((_lastold.poluchateljt IS NULL) AND (h.poluchateljt IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.osnovanie= h.osnovanie) 
			OR ((_lastold.osnovanie IS NULL) AND (h.osnovanie IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.summaj1rj1= h.summaj1rj1) 
			OR ((_lastold.summaj1rj1 IS NULL) AND (h.summaj1rj1 IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.summaj1jdj1= h.summaj1jdj1) 
			OR ((_lastold.summaj1jdj1 IS NULL) AND (h.summaj1jdj1 IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.prilozhenie= h.prilozhenie) 
			OR ((_lastold.prilozhenie IS NULL) AND (h.prilozhenie IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.tipj_dok= h.tipj_dok) 
			OR ((_lastold.tipj_dok IS NULL) AND (h.tipj_dok IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.jpj_nds= h.jpj_nds) 
			OR ((_lastold.jpj_nds IS NULL) AND (h.jpj_nds IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.jnscheta= h.jnscheta) 
			OR ((_lastold.jnscheta IS NULL) AND (h.jnscheta IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.operacija= h.operacija) 
			OR ((_lastold.operacija IS NULL) AND (h.operacija IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.c_count= h.c_count) 
			OR ((_lastold.c_count IS NULL) AND (h.c_count IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.c_nakl= h.c_nakl) 
			OR ((_lastold.c_nakl IS NULL) AND (h.c_nakl IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.username= h.username) 
			OR ((_lastold.username IS NULL) AND (h.username IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.c_owner= h.c_owner) 
			OR ((_lastold.c_owner IS NULL) AND (h.c_owner IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.ndone= h.ndone) 
			OR ((_lastold.ndone IS NULL) AND (h.ndone IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.lvzaim= h.lvzaim) 
			OR ((_lastold.lvzaim IS NULL) AND (h.lvzaim IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.paydate= h.paydate) 
			OR ((_lastold.paydate IS NULL) AND (h.paydate IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.lrewrite= h.lrewrite) 
			OR ((_lastold.lrewrite IS NULL) AND (h.lrewrite IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.pkoext= h.pkoext) 
			OR ((_lastold.pkoext IS NULL) AND (h.pkoext IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.nyear= h.nyear) 
			OR ((_lastold.nyear IS NULL) AND (h.nyear IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.whatorg= h.whatorg) 
			OR ((_lastold.whatorg IS NULL) AND (h.whatorg IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.nnew= h.nnew) 
			OR ((_lastold.nnew IS NULL) AND (h.nnew IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.newcode= h.newcode) 
			OR ((_lastold.newcode IS NULL) AND (h.newcode IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.ehkspeditor= h.ehkspeditor) 
			OR ((_lastold.ehkspeditor IS NULL) AND (h.ehkspeditor IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.lehkspeditor= h.lehkspeditor) 
			OR ((_lastold.lehkspeditor IS NULL) AND (h.lehkspeditor IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.c_currency= h.c_currency) 
			OR ((_lastold.c_currency IS NULL) AND (h.c_currency IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.jpnsp= h.jpnsp) 
			OR ((_lastold.jpnsp IS NULL) AND (h.jpnsp IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_n= h.dov_n) 
			OR ((_lastold.dov_n IS NULL) AND (h.dov_n IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_data= h.dov_data) 
			OR ((_lastold.dov_data IS NULL) AND (h.dov_data IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_dni= h.dov_dni) 
			OR ((_lastold.dov_dni IS NULL) AND (h.dov_dni IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_summa= h.dov_summa) 
			OR ((_lastold.dov_summa IS NULL) AND (h.dov_summa IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_ehkspeditor= h.dov_ehkspeditor) 
			OR ((_lastold.dov_ehkspeditor IS NULL) AND (h.dov_ehkspeditor IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.dov_type= h.dov_type) 
			OR ((_lastold.dov_type IS NULL) AND (h.dov_type IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.makedate= h.makedate) 
			OR ((_lastold.makedate IS NULL) AND (h.makedate IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.updatedate= h.updatedate) 
			OR ((_lastold.updatedate IS NULL) AND (h.updatedate IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		END IF;

		--RAISE NOTICE '_isupdated %',_isupdated;
		--RAISE NOTICE 'lastold.c_type IS NULL %',_lastold.c_type;
		IF _isupdated = TRUE THEN
			--скинем флаг предыдущей актуальной
			UPDATE acc_kassaj_j1prikhodnyej_orderaj1 
				SET actual=  0 
				WHERE acc_kassaj_j1prikhodnyej_orderaj1.js = h.js
				AND acc_kassaj_j1prikhodnyej_orderaj1.actual= - 1 ;
			-- 
			INSERT INTO acc_kassaj_j1prikhodnyej_orderaj1 
			 ( js, jnj_pj2o, data, vremja, kurs, debet, kredit, klient,
			poluchateljt, osnovanie, summaj1rj1, summaj1jdj1, prilozhenie, tipj_dok, jpj_nds, jnscheta, operacija,
			 c_count, c_nakl, username, c_owner, ndone, lvzaim, paydate, lrewrite, pkoext, nyear, whatorg, nnew, newcode,
			 ehkspeditor, lehkspeditor, c_currency, jpnsp, dov_n, dov_data, dov_dni, dov_summa, dov_ehkspeditor, dov_type,
			 makedate, updatedate )
			 VALUES(h.js, h.jnj_pj2o, h.data, h.vremja, h.kurs, h.debet, h.kredit, h.klient, h.poluchateljt, h.osnovanie,
			 h.summaj1rj1, h.summaj1jdj1, h.prilozhenie, h.tipj_dok, h.jpj_nds, h.jnscheta, h.operacija, h.c_count,
			 h.c_nakl, h.username, h.c_owner, h.ndone, h.lvzaim, h.paydate, h.lrewrite, h.pkoext, h.nyear, h.whatorg,
			 h.nnew, h.newcode, h.ehkspeditor, h.lehkspeditor, h.c_currency, h.jpnsp, h.dov_n, h.dov_data, h.dov_dni,
			 h.dov_summa, h.dov_ehkspeditor, h.dov_type, h.makedate, h.updatedate);
			--вставка новой актуальной версии
		ELSE
			--обновляем старое, если помечена как удаленная
			UPDATE acc_kassaj_j1prikhodnyej_orderaj1 
				SET actual= -  1 
			WHERE acc_kassaj_j1prikhodnyej_orderaj1.numbloaded =  _lastold.numbloaded
			AND actual=  0 ;			
			--отказываемся от вставки
		END IF;
	ELSE
		--вставка новой актуальной записи
		INSERT INTO acc_kassaj_j1prikhodnyej_orderaj1 
		 ( js, jnj_pj2o, data, vremja, kurs, debet, kredit, klient,
		poluchateljt, osnovanie, summaj1rj1, summaj1jdj1, prilozhenie, tipj_dok, jpj_nds, jnscheta, operacija,
		 c_count, c_nakl, username, c_owner, ndone, lvzaim, paydate, lrewrite, pkoext, nyear, whatorg, nnew, newcode,
		 ehkspeditor, lehkspeditor, c_currency, jpnsp, dov_n, dov_data, dov_dni, dov_summa, dov_ehkspeditor, dov_type,
		 makedate, updatedate )
		VALUES(h.js, h.jnj_pj2o, h.data, h.vremja, h.kurs, h.debet, h.kredit, h.klient, h.poluchateljt, h.osnovanie,
			h.summaj1rj1, h.summaj1jdj1, h.prilozhenie, h.tipj_dok, h.jpj_nds, h.jnscheta, h.operacija, h.c_count,
			h.c_nakl, h.username, h.c_owner, h.ndone, h.lvzaim, h.paydate, h.lrewrite, h.pkoext, h.nyear, h.whatorg,
			h.nnew, h.newcode, h.ehkspeditor, h.lehkspeditor, h.c_currency, h.jpnsp, h.dov_n, h.dov_data, h.dov_dni,
			h.dov_summa, h.dov_ehkspeditor, h.dov_type, h.makedate, h.updatedate);
	END IF;
END LOOP;
RETURN;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
то то же самое действие прокатит на порядок(и) быстрее.
а если по простому написать инсерт + апдейт (т.к. всё уже на сервере, и от непосредственной вставки извне мы ушли - триггер не нужен), то получаем

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
CREATE OR REPLACE FUNCTION f_acc_kassaj_j1prikhodnyej_orderaj1_add_checkreplica_sql_old()
  RETURNS void AS
$BODY$
-- работает и в 7.4 - где баг с IS DISTINCT FROM
UPDATE acc_kassaj_j1prikhodnyej_orderaj1
	SET actual =  0 
FROM acc_kassaj_j1prikhodnyej_orderaj1_heap AS h 
LEFT JOIN acc_kassaj_j1prikhodnyej_orderaj1 AS p USING (js)
WHERE
acc_kassaj_j1prikhodnyej_orderaj1.js= h.js
AND 
acc_kassaj_j1prikhodnyej_orderaj1.actual = - 1 
AND 
p.actual = - 1 
AND
NOT (
COALESCE(((p.jnj_pj2o= h.jnj_pj2o) 
			OR ((p.jnj_pj2o IS NULL) AND (h.jnj_pj2o IS NULL))),FALSE)
		AND
		COALESCE(((p.data= h.data) 
			OR ((p.data IS NULL) AND (h.data IS NULL))),FALSE)
		AND
		COALESCE(((p.vremja= h.vremja) 
			OR ((p.vremja IS NULL) AND (h.vremja IS NULL))),FALSE)
		AND
		COALESCE(((p.kurs= h.kurs) 
			OR ((p.kurs IS NULL) AND (h.kurs IS NULL))),FALSE)
		AND
		COALESCE(((p.debet= h.debet) 
			OR ((p.debet IS NULL) AND (h.debet IS NULL))),FALSE)
		AND
		COALESCE(((p.kredit= h.kredit) 
			OR ((p.kredit IS NULL) AND (h.kredit IS NULL))),FALSE)
		AND
		COALESCE(((p.klient= h.klient) 
			OR ((p.klient IS NULL) AND (h.klient IS NULL))),FALSE)
		AND
		COALESCE(((p.poluchateljt= h.poluchateljt) 
			OR ((p.poluchateljt IS NULL) AND (h.poluchateljt IS NULL))),FALSE)
		AND
		COALESCE(((p.osnovanie= h.osnovanie) 
			OR ((p.osnovanie IS NULL) AND (h.osnovanie IS NULL))),FALSE)
		AND
		COALESCE(((p.summaj1rj1= h.summaj1rj1) 
			OR ((p.summaj1rj1 IS NULL) AND (h.summaj1rj1 IS NULL))),FALSE)
		AND
		COALESCE(((p.summaj1jdj1= h.summaj1jdj1) 
			OR ((p.summaj1jdj1 IS NULL) AND (h.summaj1jdj1 IS NULL))),FALSE)
		AND
		COALESCE(((p.prilozhenie= h.prilozhenie) 
			OR ((p.prilozhenie IS NULL) AND (h.prilozhenie IS NULL))),FALSE)
		AND
		COALESCE(((p.tipj_dok= h.tipj_dok) 
			OR ((p.tipj_dok IS NULL) AND (h.tipj_dok IS NULL))),FALSE)
		AND
		COALESCE(((p.jpj_nds= h.jpj_nds) 
			OR ((p.jpj_nds IS NULL) AND (h.jpj_nds IS NULL))),FALSE)
		AND
		COALESCE(((p.jnscheta= h.jnscheta) 
			OR ((p.jnscheta IS NULL) AND (h.jnscheta IS NULL))),FALSE)
		AND
		COALESCE(((p.operacija= h.operacija) 
			OR ((p.operacija IS NULL) AND (h.operacija IS NULL))),FALSE)
		AND
		COALESCE(((p.c_count= h.c_count) 
			OR ((p.c_count IS NULL) AND (h.c_count IS NULL))),FALSE)
		AND
		COALESCE(((p.c_nakl= h.c_nakl) 
			OR ((p.c_nakl IS NULL) AND (h.c_nakl IS NULL))),FALSE)
		AND
		COALESCE(((p.username= h.username) 
			OR ((p.username IS NULL) AND (h.username IS NULL))),FALSE)
		AND
		COALESCE(((p.c_owner= h.c_owner) 
			OR ((p.c_owner IS NULL) AND (h.c_owner IS NULL))),FALSE)
		AND
		COALESCE(((p.ndone= h.ndone) 
			OR ((p.ndone IS NULL) AND (h.ndone IS NULL))),FALSE)
		AND
		COALESCE(((p.lvzaim= h.lvzaim) 
			OR ((p.lvzaim IS NULL) AND (h.lvzaim IS NULL))),FALSE)
		AND
		COALESCE(((p.paydate= h.paydate) 
			OR ((p.paydate IS NULL) AND (h.paydate IS NULL))),FALSE)
		AND
		COALESCE(((p.lrewrite= h.lrewrite) 
			OR ((p.lrewrite IS NULL) AND (h.lrewrite IS NULL))),FALSE)
		AND
		COALESCE(((p.pkoext= h.pkoext) 
			OR ((p.pkoext IS NULL) AND (h.pkoext IS NULL))),FALSE)
		AND
		COALESCE(((p.nyear= h.nyear) 
			OR ((p.nyear IS NULL) AND (h.nyear IS NULL))),FALSE)
		AND
		COALESCE(((p.whatorg= h.whatorg) 
			OR ((p.whatorg IS NULL) AND (h.whatorg IS NULL))),FALSE)
		AND
		COALESCE(((p.nnew= h.nnew) 
			OR ((p.nnew IS NULL) AND (h.nnew IS NULL))),FALSE)
		AND
		COALESCE(((p.newcode= h.newcode) 
			OR ((p.newcode IS NULL) AND (h.newcode IS NULL))),FALSE)
		AND
		COALESCE(((p.ehkspeditor= h.ehkspeditor) 
			OR ((p.ehkspeditor IS NULL) AND (h.ehkspeditor IS NULL))),FALSE)
		AND
		COALESCE(((p.lehkspeditor= h.lehkspeditor) 
			OR ((p.lehkspeditor IS NULL) AND (h.lehkspeditor IS NULL))),FALSE)
		AND
		COALESCE(((p.c_currency= h.c_currency) 
			OR ((p.c_currency IS NULL) AND (h.c_currency IS NULL))),FALSE)
		AND
		COALESCE(((p.jpnsp= h.jpnsp) 
			OR ((p.jpnsp IS NULL) AND (h.jpnsp IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_n= h.dov_n) 
			OR ((p.dov_n IS NULL) AND (h.dov_n IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_data= h.dov_data) 
			OR ((p.dov_data IS NULL) AND (h.dov_data IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_dni= h.dov_dni) 
			OR ((p.dov_dni IS NULL) AND (h.dov_dni IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_summa= h.dov_summa) 
			OR ((p.dov_summa IS NULL) AND (h.dov_summa IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_ehkspeditor= h.dov_ehkspeditor) 
			OR ((p.dov_ehkspeditor IS NULL) AND (h.dov_ehkspeditor IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_type= h.dov_type) 
			OR ((p.dov_type IS NULL) AND (h.dov_type IS NULL))),FALSE)
		AND
		COALESCE(((p.makedate= h.makedate) 
			OR ((p.makedate IS NULL) AND (h.makedate IS NULL))),FALSE)
		AND
		COALESCE(((p.updatedate= h.updatedate) 
			OR ((p.updatedate IS NULL) AND (h.updatedate IS NULL))),FALSE)
)
;


INSERT INTO acc_kassaj_j1prikhodnyej_orderaj1 ( js, jnj_pj2o, data, vremja, kurs, debet, kredit, klient,
 poluchateljt, osnovanie, summaj1rj1, summaj1jdj1, prilozhenie, tipj_dok, jpj_nds, jnscheta, operacija,
 c_count, c_nakl, username, c_owner, ndone, lvzaim, paydate, lrewrite, pkoext, nyear, whatorg, nnew, newcode,
 ehkspeditor, lehkspeditor, c_currency, jpnsp, dov_n, dov_data, dov_dni, dov_summa, dov_ehkspeditor, dov_type,
 makedate, updatedate )
SELECT h.js, h.jnj_pj2o, h.data, h.vremja, h.kurs, h.debet, h.kredit, h.klient, h.poluchateljt, h.osnovanie,
 h.summaj1rj1, h.summaj1jdj1, h.prilozhenie, h.tipj_dok, h.jpj_nds, h.jnscheta, h.operacija, h.c_count,
 h.c_nakl, h.username, h.c_owner, h.ndone, h.lvzaim, h.paydate, h.lrewrite, h.pkoext, h.nyear, h.whatorg,
 h.nnew, h.newcode, h.ehkspeditor, h.lehkspeditor, h.c_currency, h.jpnsp, h.dov_n, h.dov_data, h.dov_dni,
 h.dov_summa, h.dov_ehkspeditor, h.dov_type, h.makedate, h.updatedate
FROM acc_kassaj_j1prikhodnyej_orderaj1_heap AS h 
LEFT JOIN acc_kassaj_j1prikhodnyej_orderaj1 AS p USING(js)
WHERE 
NOT EXISTS(SELECT js FROM acc_kassaj_j1prikhodnyej_orderaj1
 AS p2 WHERE p2.actual =- 1  AND p2.js = h.js)
--(p.actual = -1 OR p.js IS NULL)
AND 
NOT (
COALESCE(((p.jnj_pj2o= h.jnj_pj2o) 
			OR ((p.jnj_pj2o IS NULL) AND (h.jnj_pj2o IS NULL))),FALSE)
		AND
		COALESCE(((p.data= h.data) 
			OR ((p.data IS NULL) AND (h.data IS NULL))),FALSE)
		AND
		COALESCE(((p.vremja= h.vremja) 
			OR ((p.vremja IS NULL) AND (h.vremja IS NULL))),FALSE)
		AND
		COALESCE(((p.kurs= h.kurs) 
			OR ((p.kurs IS NULL) AND (h.kurs IS NULL))),FALSE)
		AND
		COALESCE(((p.debet= h.debet) 
			OR ((p.debet IS NULL) AND (h.debet IS NULL))),FALSE)
		AND
		COALESCE(((p.kredit= h.kredit) 
			OR ((p.kredit IS NULL) AND (h.kredit IS NULL))),FALSE)
		AND
		COALESCE(((p.klient= h.klient) 
			OR ((p.klient IS NULL) AND (h.klient IS NULL))),FALSE)
		AND
		COALESCE(((p.poluchateljt= h.poluchateljt) 
			OR ((p.poluchateljt IS NULL) AND (h.poluchateljt IS NULL))),FALSE)
		AND
		COALESCE(((p.osnovanie= h.osnovanie) 
			OR ((p.osnovanie IS NULL) AND (h.osnovanie IS NULL))),FALSE)
		AND
		COALESCE(((p.summaj1rj1= h.summaj1rj1) 
			OR ((p.summaj1rj1 IS NULL) AND (h.summaj1rj1 IS NULL))),FALSE)
		AND
		COALESCE(((p.summaj1jdj1= h.summaj1jdj1) 
			OR ((p.summaj1jdj1 IS NULL) AND (h.summaj1jdj1 IS NULL))),FALSE)
		AND
		COALESCE(((p.prilozhenie= h.prilozhenie) 
			OR ((p.prilozhenie IS NULL) AND (h.prilozhenie IS NULL))),FALSE)
		AND
		COALESCE(((p.tipj_dok= h.tipj_dok) 
			OR ((p.tipj_dok IS NULL) AND (h.tipj_dok IS NULL))),FALSE)
		AND
		COALESCE(((p.jpj_nds= h.jpj_nds) 
			OR ((p.jpj_nds IS NULL) AND (h.jpj_nds IS NULL))),FALSE)
		AND
		COALESCE(((p.jnscheta= h.jnscheta) 
			OR ((p.jnscheta IS NULL) AND (h.jnscheta IS NULL))),FALSE)
		AND
		COALESCE(((p.operacija= h.operacija) 
			OR ((p.operacija IS NULL) AND (h.operacija IS NULL))),FALSE)
		AND
		COALESCE(((p.c_count= h.c_count) 
			OR ((p.c_count IS NULL) AND (h.c_count IS NULL))),FALSE)
		AND
		COALESCE(((p.c_nakl= h.c_nakl) 
			OR ((p.c_nakl IS NULL) AND (h.c_nakl IS NULL))),FALSE)
		AND
		COALESCE(((p.username= h.username) 
			OR ((p.username IS NULL) AND (h.username IS NULL))),FALSE)
		AND
		COALESCE(((p.c_owner= h.c_owner) 
			OR ((p.c_owner IS NULL) AND (h.c_owner IS NULL))),FALSE)
		AND
		COALESCE(((p.ndone= h.ndone) 
			OR ((p.ndone IS NULL) AND (h.ndone IS NULL))),FALSE)
		AND
		COALESCE(((p.lvzaim= h.lvzaim) 
			OR ((p.lvzaim IS NULL) AND (h.lvzaim IS NULL))),FALSE)
		AND
		COALESCE(((p.paydate= h.paydate) 
			OR ((p.paydate IS NULL) AND (h.paydate IS NULL))),FALSE)
		AND
		COALESCE(((p.lrewrite= h.lrewrite) 
			OR ((p.lrewrite IS NULL) AND (h.lrewrite IS NULL))),FALSE)
		AND
		COALESCE(((p.pkoext= h.pkoext) 
			OR ((p.pkoext IS NULL) AND (h.pkoext IS NULL))),FALSE)
		AND
		COALESCE(((p.nyear= h.nyear) 
			OR ((p.nyear IS NULL) AND (h.nyear IS NULL))),FALSE)
		AND
		COALESCE(((p.whatorg= h.whatorg) 
			OR ((p.whatorg IS NULL) AND (h.whatorg IS NULL))),FALSE)
		AND
		COALESCE(((p.nnew= h.nnew) 
			OR ((p.nnew IS NULL) AND (h.nnew IS NULL))),FALSE)
		AND
		COALESCE(((p.newcode= h.newcode) 
			OR ((p.newcode IS NULL) AND (h.newcode IS NULL))),FALSE)
		AND
		COALESCE(((p.ehkspeditor= h.ehkspeditor) 
			OR ((p.ehkspeditor IS NULL) AND (h.ehkspeditor IS NULL))),FALSE)
		AND
		COALESCE(((p.lehkspeditor= h.lehkspeditor) 
			OR ((p.lehkspeditor IS NULL) AND (h.lehkspeditor IS NULL))),FALSE)
		AND
		COALESCE(((p.c_currency= h.c_currency) 
			OR ((p.c_currency IS NULL) AND (h.c_currency IS NULL))),FALSE)
		AND
		COALESCE(((p.jpnsp= h.jpnsp) 
			OR ((p.jpnsp IS NULL) AND (h.jpnsp IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_n= h.dov_n) 
			OR ((p.dov_n IS NULL) AND (h.dov_n IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_data= h.dov_data) 
			OR ((p.dov_data IS NULL) AND (h.dov_data IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_dni= h.dov_dni) 
			OR ((p.dov_dni IS NULL) AND (h.dov_dni IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_summa= h.dov_summa) 
			OR ((p.dov_summa IS NULL) AND (h.dov_summa IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_ehkspeditor= h.dov_ehkspeditor) 
			OR ((p.dov_ehkspeditor IS NULL) AND (h.dov_ehkspeditor IS NULL))),FALSE)
		AND
		COALESCE(((p.dov_type= h.dov_type) 
			OR ((p.dov_type IS NULL) AND (h.dov_type IS NULL))),FALSE)
		AND
		COALESCE(((p.makedate= h.makedate) 
			OR ((p.makedate IS NULL) AND (h.makedate IS NULL))),FALSE)
		AND
		COALESCE(((p.updatedate= h.updatedate) 
			OR ((p.updatedate IS NULL) AND (h.updatedate IS NULL))),FALSE)
);
$BODY$
  LANGUAGE 'sql' VOLATILE;
уже 3 сек. в 7-ке и 0.6 в 8-ке.
для справок текст в 8-ке , из за отсутствия бага, много короче

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
CREATE OR REPLACE FUNCTION f_acc_kassaj_j1prikhodnyej_orderaj1_add_checkreplica_sql()
  RETURNS void AS
$BODY$UPDATE acc_kassaj_j1prikhodnyej_orderaj1
	SET actual =  0 
FROM
/*
SELECT acc_kassaj_j1prikhodnyej_orderaj1.*
FROM acc_kassaj_j1prikhodnyej_orderaj1
INNER JOIN 
*/
acc_kassaj_j1prikhodnyej_orderaj1_heap AS h 
-- USING (js)
LEFT JOIN acc_kassaj_j1prikhodnyej_orderaj1 AS p USING (js)
WHERE
acc_kassaj_j1prikhodnyej_orderaj1.js= h.js
AND 
acc_kassaj_j1prikhodnyej_orderaj1.actual = - 1 
AND 
p.actual = - 1 
AND
(
 (p.jnj_pj2o, p.data, p.vremja, p.kurs, p.debet, p.kredit, p.klient, p.poluchateljt, p.osnovanie,
 p.summaj1rj1, p.summaj1jdj1, p.prilozhenie, p.tipj_dok, p.jpj_nds, p.jnscheta, p.operacija, p.c_count,
 p.c_nakl, p.username, p.c_owner, p.ndone, p.lvzaim, p.paydate, p.lrewrite, p.pkoext, p.nyear, p.whatorg,
 p.nnew, p.newcode, p.ehkspeditor, p.lehkspeditor, p.c_currency, p.jpnsp, p.dov_n, p.dov_data, p.dov_dni,
 p.dov_summa, p.dov_ehkspeditor, p.dov_type, p.makedate, p.updatedate)
IS DISTINCT FROM
(h.jnj_pj2o, h.data, h.vremja, h.kurs, h.debet, h.kredit, h.klient, h.poluchateljt, h.osnovanie,
 h.summaj1rj1, h.summaj1jdj1, h.prilozhenie, h.tipj_dok, h.jpj_nds, h.jnscheta, h.operacija, h.c_count,
 h.c_nakl, h.username, h.c_owner, h.ndone, h.lvzaim, h.paydate, h.lrewrite, h.pkoext, h.nyear, h.whatorg,
 h.nnew, h.newcode, h.ehkspeditor, h.lehkspeditor, h.c_currency, h.jpnsp, h.dov_n, h.dov_data, h.dov_dni,
 h.dov_summa, h.dov_ehkspeditor, h.dov_type, h.makedate, h.updatedate)

)
;

INSERT INTO acc_kassaj_j1prikhodnyej_orderaj1 ( js, jnj_pj2o, data, vremja, kurs, debet, kredit, klient,
 poluchateljt, osnovanie, summaj1rj1, summaj1jdj1, prilozhenie, tipj_dok, jpj_nds, jnscheta, operacija,
 c_count, c_nakl, username, c_owner, ndone, lvzaim, paydate, lrewrite, pkoext, nyear, whatorg, nnew, newcode,
 ehkspeditor, lehkspeditor, c_currency, jpnsp, dov_n, dov_data, dov_dni, dov_summa, dov_ehkspeditor, dov_type,
 makedate, updatedate )

SELECT h.js, h.jnj_pj2o, h.data, h.vremja, h.kurs, h.debet, h.kredit, h.klient, h.poluchateljt, h.osnovanie,
 h.summaj1rj1, h.summaj1jdj1, h.prilozhenie, h.tipj_dok, h.jpj_nds, h.jnscheta, h.operacija, h.c_count,
 h.c_nakl, h.username, h.c_owner, h.ndone, h.lvzaim, h.paydate, h.lrewrite, h.pkoext, h.nyear, h.whatorg,
 h.nnew, h.newcode, h.ehkspeditor, h.lehkspeditor, h.c_currency, h.jpnsp, h.dov_n, h.dov_data, h.dov_dni,
 h.dov_summa, h.dov_ehkspeditor, h.dov_type, h.makedate, h.updatedate
FROM acc_kassaj_j1prikhodnyej_orderaj1_heap AS h 
LEFT JOIN acc_kassaj_j1prikhodnyej_orderaj1 AS p 
--USING(js)
ON h.js=p.js AND p.actual =- 1 
WHERE 
p.js is null
--уже не надо проверять дистинктность с неактуальными
/*
NOT EXISTS(SELECT js FROM acc_kassaj_j1prikhodnyej_orderaj1
 AS p2 WHERE p2.actual =-1 AND p2.js = h.js)
--(p.actual = -1 OR p.js IS NULL)
AND 
(
  (p.jnj_pj2o, p.data, p.vremja, p.kurs, p.debet, p.kredit, p.klient, p.poluchateljt, p.osnovanie,
 p.summaj1rj1, p.summaj1jdj1, p.prilozhenie, p.tipj_dok, p.jpj_nds, p.jnscheta, p.operacija, p.c_count,
 p.c_nakl, p.username, p.c_owner, p.ndone, p.lvzaim, p.paydate, p.lrewrite, p.pkoext, p.nyear, p.whatorg,
 p.nnew, p.newcode, p.ehkspeditor, p.lehkspeditor, p.c_currency, p.jpnsp, p.dov_n, p.dov_data, p.dov_dni,
 p.dov_summa, p.dov_ehkspeditor, p.dov_type, p.makedate, p.updatedate)
IS DISTINCT FROM
(h.jnj_pj2o, h.data, h.vremja, h.kurs, h.debet, h.kredit, h.klient, h.poluchateljt, h.osnovanie,
 h.summaj1rj1, h.summaj1jdj1, h.prilozhenie, h.tipj_dok, h.jpj_nds, h.jnscheta, h.operacija, h.c_count,
 h.c_nakl, h.username, h.c_owner, h.ndone, h.lvzaim, h.paydate, h.lrewrite, h.pkoext, h.nyear, h.whatorg,
 h.nnew, h.newcode, h.ehkspeditor, h.lehkspeditor, h.c_currency, h.jpnsp, h.dov_n, h.dov_data, h.dov_dni,
 h.dov_summa, h.dov_ehkspeditor, h.dov_type, h.makedate, h.updatedate)
)
*/;$BODY$
  LANGUAGE 'sql' VOLATILE;
надеюс, ястно об чем я тут сам с собой офтопил? токо вот осилит ли хто это прочитать
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33672829
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я осилил.. :)
но чесно говоря.. тока догадки и есть
недогоняю почему тригер медленнее чем вторая хп фактически это тожесамое. есдинственное что это то что тригер вызывается чаще.. но это не аргумент.
и вот это:
Код: plaintext
1.
2.
3.
4.
IF NOT COALESCE(((_lastold.jnj_pj2o= NEW.jnj_pj2o) 
			OR ((_lastold.jnj_pj2o IS NULL) AND (NEW.jnj_pj2o IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.data= NEW.data) 
видимо делается силами sql на лету.

а вообще сдается мне что косяки внутри логики plpgsql... чесно говоря других обьяснений у меня нету..


я бы на сях бы попробовал написать хп чтоб выяснить.
...
Рейтинг: 0 / 0
SAVEPOINT в ХП
    #33673152
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wbearя осилил.. :) радд

wbearнедогоняю почему тригер медленнее чем вторая хп фактически это тожесамое. есдинственное что это то что тригер вызывается чаще.. но это не аргумент.аналогично, почему и полез смотрет локи. Триггер еще и "отменяет инсерт" (в моем случае) хп его попросту не деет, но и это, имхо, не аргумент.

это, честно говоря, основной вопрос. (разница между хапой с 8000 отдельных селектов (инсертов и упдейтов, если есть) и между хапой со всего двумя запросами видимо таки обязана быть - тут вопросов как то меньше - "интуитивно понятно", шо интерпретация 8000 текстов должна быть дороже чем одного) wbearи вот это:
Код: plaintext
1.
2.
3.
4.
IF NOT COALESCE(((_lastold.jnj_pj2o= NEW.jnj_pj2o) 
			OR ((_lastold.jnj_pj2o IS NULL) AND (NEW.jnj_pj2o IS NULL))),FALSE)
				THEN _isupdated = TRUE;
		ELSIF NOT COALESCE(((_lastold.data= NEW.data) 
видимо делается силами sql на лету.да, видимо это потгреса не напрягает уж очень сильно (а в случае 8-ки этот гроб заменим простым дистинктом 2-х ROW, главное штобы типы были один в один). Ибо в запросе тот же гроб для того же числа записей.

wbearа вообще сдается мне что косяки внутри логики plpgsql... чесно говоря других обьяснений у меня нету..


я бы на сях бы попробовал написать хп чтоб выяснить.не сионист, к сожалению (и вапше я - физик-исследователь ф прошлой жизни)
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SAVEPOINT в ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]