LIKE podmínka shody vzoru očekává, že typy znaků budou vidět jako operandy na levé i pravé straně. Když narazí na ČÍSLO, implicitně jej převede na znak. Váš dotaz 1 je v podstatě tiše přepsán na toto:
SELECT a1.*
FROM people a1
WHERE TO_CHAR(a1.id) LIKE '119%'
AND ROWNUM < 5
To se děje ve vašem případě, a to je špatné ze dvou důvodů:
- Konverze se provádí pro každý řádek, což je pomalé;
- Vzhledem k funkci (ačkoli implicitní) v predikátu WHERE nemůže Oracle použít index na
A1.ID
sloupec.
Chcete-li to obejít, musíte provést jednu z následujících akcí:
-
Vytvořte index založený na funkcích na
A1.ID
sloupec:CREATE INDEX people_idx5 ON people (TO_CHAR(id));
-
Pokud potřebujete porovnat záznamy na prvních 3 znacích sloupce ID, vytvořte další sloupec typu NUMBER obsahující pouze tyto 3 znaky a použijte prostý = operátora.
-
Vytvořte samostatný sloupec
ID_CHAR
typuVARCHAR2
a vyplňte jejTO_CHAR(id)
. Indexujte jej a použijte místoID
ve vašemWHERE
podmínka.Samozřejmě, pokud se rozhodnete vytvořit další sloupec na základě existujícího sloupce ID, musíte tyto 2 synchronizovat. Můžete to udělat v dávce jako jedna AKTUALIZACE nebo ve spouštěči ON-UPDATE, nebo přidat tento sloupec do příslušného Příkazy INSERT a UPDATE ve vašem kódu.