powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SAVEPOINT в ХП
4 сообщений из 29, страница 2 из 2
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
4 сообщений из 29, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SAVEPOINT в ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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