sql >> Databáze >  >> RDS >> Oracle

Za jakých podmínek ROWNUM=1 významně zvyšuje výkon v existujícím dotazu stylu

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;


  1. Potřebujete dynamicky vybrat prvek pole JSON z tabulky postgresql

  2. Jak zlepšit výkon dotazů s mnoha JOINy

  3. Jak získat hodnotu autoinkrementu posledního řádku na vložce

  4. mysql přesnost násobení v desítkové soustavě a tinyint