Vytváření dočasných tabulek uvnitř funkcí
Skočit na navigaci
Skočit na vyhledávání
Do verze 8.3 platilo pravidlo, že uvnitř funkcí dočasné tabulky zásadně nerušíme - pokud jsme toto pravidlo porušili, pak při opakovaném provádění dotazu funkce selhala - nakešovaný prováděcí plán se odkazoval již na neexistující tabulku. V 8.3 již byla tato chyba opravena. Při dropnutí tabulky se odstraní i všechny prováděcí plány, které se odkazují na odstraněnou tabulku. Tato možnost tu je, nicméně je poměrně náročná, a staré řešení je o dost rychlejší. K mému překvapení je nejrychlejší řešení založené na zachycení výjimky:
create or replace function test1() returns void as $$ begin drop table if exists omega; create temp table omega(a integer); insert into omega values(10); if exists(select * from omega) then end if; end; $$ language plpgsql; create or replace function test2() returns void as $$ begin if exists(select * from pg_class where relname='omega' and pg_table_is_visible(oid)) then delete from omega; else create temp table omega(a integer); end if; insert into omega values(10); if exists(select * from omega) then end if; end; $$ language plpgsql; create or replace function test3() returns void as $$ begin begin delete from omega; exception when others then create temp table omega(a integer); end; insert into omega values(10); if exists(select * from omega) then end if; end; $$ language plpgsql;
Volání v pgbenchi pro 1000 transakcí, 10 klientů
Test1: transaction type: Custom query scaling factor: 1 query mode: simple number of clients: 10 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 tps = 339.780441 (including connections establishing) tps = 340.172513 (excluding connections establishing) Test2: scaling factor: 1 query mode: simple number of clients: 10 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 tps = 1891.021562 (including connections establishing) tps = 1907.533096 (excluding connections establishing) Test3: transaction type: Custom query scaling factor: 1 query mode: simple number of clients: 10 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 tps = 2664.756569 (including connections establishing) tps = 2698.289177 (excluding connections establishing