PostgreSQL版本为9.0。优化plpgsql函数
我必须优化一个plpgsql函数。这个想法只是运行所有文档,并测试表webdte.doc_tip_cifra
中的相关行902,903,905,907是否已经存在。如果它们不存在,则插入空行以满足之后的验证。即使我只使用4个条件中的一个,并使用其中一半的行数来运行,它现在的速度也很慢。任何人都有提高性能的想法?
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;
也许最好是决定一个INSERT触发器,即插入每个文档中插入的doc_tip_cifra
4个空行,以避免对所有文件和检验4次,每次文件这个愚蠢昂贵的循环? 你觉得呢?
非常感谢你!我只是在学习postgres,你真的打开了我的眼睛与这一个。凉.. – mugdiman 2012-07-24 04:05:45