Výrazně zlepšuje výkon (průměrně desítky procent) na dotazy, které nelze vyřešit jednoduchým vyhledáváním jednoho indexu, např. Tabulky spojuje. Má však potenciál skrýt chybu dat/aplikace.
Pojďme mít stůl:
create table t (id number(10,0), padding varchar2(1000));
--záměrně nepoužívejte PK, aby byl příklad co nejjednodušší. Výplň se používá k simulaci skutečného zatížení dat v každém záznamu
s mnoha záznamy:
insert into t (id, padding)
select rownum, rpad(' ', 1000) from dual connect by level < 10000
Nyní, když se zeptáte na něco jako
select 1 into ll_exists
from t where id = 5;
DB musí projít celou tabulku, ať už našla jediný odpovídající záznam v prvním datovém bloku (což mimochodem nemůžeme vědět, protože by se dal vložit mnoha různými způsoby) nebo v posledním. To proto, že neví, že existuje pouze jeden odpovídající záznam. Na druhou stranu, pokud použijete ... a rownum =1, může přestat procházet daty poté, co je záznam nalezen, protože jste mu řekli, že neexistuje (nebo není potřeba) jiný odpovídající záznam.
Nevýhodou je, že s omezením rownum můžete získat nedeterministické výsledky, pokud data obsahují více než jeden možný záznam. Pokud byl dotaz
select id into ll_id
from t where mod (id, 2) = 1
and rownum = 1;
pak mohu dostat z DB odpověď 1 i 3 i 123 ... objednávka není zaručena a to je důsledek. (bez klauzule rownum bych dostal TOO_MANY_ROWS výjimku. Záleží na situaci, která z nich je horší)
Pokud opravdu chcete dotaz na existenci testů, NAPIŠTE TO TAK.
begin
select 'It does'
into ls_exists
from dual where
exists (your_original_query_without_rownum);
do_something_when_it_does_exist
exception
when no_data_found then
do_something_when_it_doesn't_exist
end;