602SQL-Úplná dokumentace Index  

Použití indexů v dotazech na prefix

Každý index uspořádává záznamy podle hodnot indexového klíče, vzestupně nebo sestupně. Je-li indexovým klíčem znakový řetězec, pak se používá lexikografické uspořádání podle jazyka určeného v popisu sloupce tabulky.

Národní lexikografické uspořádání hodnot klíče umožňuje efektivní vyhodnocení podmínek na rovnost nebo nerovnost řetězců použitých v dotazu a také setřídění záznamů v odpovědi na dotaz. Nehodí se však k optimalizaci dotazů obsahujících podmínku na prefix. Uvažujme český jazyk a tabulku obsahující tato data: 'caa', 'czz', 'd', 'cha', 'Ostra', 'Ostrá', 'Ostrava'.

V národním lexikografickém indexu jsou tyto záznamy v tom pořadí, v němž jsou výše uvedeny. Pokud by se použil tento index k optimalizaci dotazu sloupec LIKE 'c%', pak by odpověď na dotaz obsahovala záznamu 'caa', 'czz', ale již nikoli 'cha', protože průchod indexem by skončil na záznamu 'd'. Podobně odpověď na dotaz sloupec LIKE 'Ostra%' by obsahovala pouze záznam 'Ostra', protože záznam 'Ostrá' by vytváření odpovědi ukončil a záznam 'Ostrava' by nemohl být nalezen, což by bylo evidentně špatně.

Národní lexikografické indexy nelze proto použít pro optimalizaci dotazů na prefix a optimalizátor jej proto ignoruje.

K tomu, aby bylo možno efektivně zodpovídat dotazy s podmínkami na prefix, je třeba v tabulce definovat jiný index. Pro sloupec XYZ typu řetězec znaků délky D je třeba použít indexový výraz:

CAST(XYZ AS CHAR(D))
Takový index bude třídit záznamy podle ASCII uspořádání a bude moci být proto využit pro optimalizaci podmínek na prefixy (ale bez ohledu na národní specifika). Má-li hledání podle tohoto indexu nerozlišovat velikost písmen (ignorovat case senzitivitu), musí tomu odpovídat i indexový výraz:
CAST(UPPER(XYZ) AS CHAR(D))

Pokud se některý řetězcový sloupec tabulky používá jak v podmínkách s rovnostmi či nerovnostmi tak i v podmínkách na prefix, pak pro efektivní vyhodnocení takových dotazů je nutno vybavit tabulku dvěma indexy.