PostgreSQL のバージョンは 9.0 です。
plpgsql 関数を最適化する必要があります。アイデアは、すべてのドキュメントを実行して、テーブル内の関連する行 902,903,905,907 がwebdte.doc_tip_cifra
既に存在するかどうかをテストすることです。まだ存在しない場合は、後で検証を満たすために null 行を挿入します。4 つの条件の 1 つだけを使用し、実行する必要がある行の量の半分を使用しても、現時点ではとてつもなく遅いです。パフォーマンスを向上させるためのアイデアはありますか?
CREATE OR REPLACE FUNCTION webdte.addtagobligatoriosventa(idlibro bigint)
RETURNS character AS
$BODY$
DECLARE
id_documento bigint;
validador integer;
validador1 integer;
validador2 integer;
validador3 integer;
validador4 integer;
tipo_cifra integer;
--counts integer[];
BEGIN
SELECT INTO validador1, validador2, validador3, validador4
max(CASE id_tipo_cifra WHEN 901 THEN 1 ELSE 0 END)
,max(CASE id_tipo_cifra WHEN 902 THEN 1 ELSE 0 END)
,max(CASE id_tipo_cifra WHEN 905 THEN 1 ELSE 0 END)
,max(CASE id_tipo_cifra WHEN 907 THEN 1 ELSE 0 END)
FROM webdte.doc_tip_cifra
WHERE id_doc = id_documento;
if (validador1 = 0) then
insert into webdte.doc_tip_cifra (id_doc, id_tipo_cifra, tasa_imp, val_imp)
values (id_documento, 901, 0, 0);
end if;
if (validador2 = 0) then
insert into webdte.doc_tip_cifra (id_doc, id_tipo_cifra, tasa_imp, val_imp)
values (id_documento, 902, 0, 0);
end if;
if (validador3 = 0) then
insert into webdte.doc_tip_cifra (id_doc, id_tipo_cifra, tasa_imp, val_imp)
values (id_documento, 905, 0, 0);
end if;
if (validador4 = 0) then
insert into webdte.doc_tip_cifra (id_doc, id_tipo_cifra, tasa_imp, val_imp)
values (id_documento, 907, 0, 0);
end if;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
doc_tip_cifra
すべてのドキュメントに対するこのばかげた高価なループを回避し、ドキュメントごとに 4 回テストするために、ドキュメントの挿入ごとに 4 つの null 行を挿入する挿入トリガーを決定することをお勧めします。どう思いますか?