Vytváření dočasných tabulek uvnitř funkcí

Z PostgreSQL
Verze z 18. 11. 2008, 15:15, kterou vytvořil imported>Pavel (Nová stránka: 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 selhal...)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
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