Ervan uitgaande dat maximale prestaties het doel zijn, zou ik idealiter SUBSTR(my_field,1,6)
kiezen en maak een op functies gebaseerde index om de zoekopdracht te ondersteunen.
CREATE INDEX my_substr_idx
ON my_table( substr( my_field,1,6 ) );
Zoals anderen aangeven, SUBSTR(my_field,1,6)
zou geen normale index kunnen gebruiken op MY_FIELD
. De LIKE-versie zou de index kunnen gebruiken, maar de kardinaliteitsschattingen van de optimizer zijn in dat geval over het algemeen nogal mager, dus het is vrij waarschijnlijk dat ofwel geen index wordt gebruikt wanneer dit nuttig zou zijn, ofwel een index gebruikt wanneer een tabelscan de voorkeur zou hebben. Het indexeren van de daadwerkelijke expressie geeft de optimizer veel meer informatie om mee te werken, dus het is veel waarschijnlijker dat de index correct wordt gekozen. Iemand die slimmer is dan ik kan misschien een manier voorstellen om statistieken over virtuele kolommen in 11g te gebruiken om de optimizer betere informatie te geven voor de LIKE-query.
Als 6 een variabele is (d.w.z. u wilt soms de eerste 6 tekens zoeken en soms een ander nummer), zult u waarschijnlijk geen functiegebaseerde index kunnen bedenken om die zoekopdracht te ondersteunen. In dat geval ben je waarschijnlijk beter af met de grillen van de beslissingen van de optimizer met de LIKE-formulering.