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