sql >> Databasteknik >  >> RDS >> Oracle

Är substr eller LIKE snabbare i Oracle?

Förutsatt att maximal prestanda är målet skulle jag helst välja SUBSTR(my_field,1,6) och skapa ett funktionsbaserat index för att stödja frågan.

CREATE INDEX my_substr_idx
    ON my_table( substr( my_field,1,6 ) );

Som andra påpekar, SUBSTR(my_field,1,6) skulle inte kunna använda ett vanligt index på MY_FIELD . LIKE-versionen kan använda indexet, men optimerarens kardinalitetsuppskattningar i det fallet är i allmänhet ganska dåliga så det är ganska troligt att antingen inte använda ett index när det skulle vara användbart eller att använda ett index när en tabellskanning skulle vara att föredra. Indexering av det faktiska uttrycket kommer att ge optimeraren mycket mer information att arbeta med så det är mycket mer sannolikt att välja indexet korrekt. Någon smartare än jag kanske kan föreslå ett sätt att använda statistik om virtuella kolumner i 11g för att ge optimeraren bättre information för LIKE-frågan.

Om 6 är en variabel (dvs. du vill ibland söka de första 6 tecknen och ibland vill söka efter ett annat nummer), kommer du förmodligen inte att kunna komma på ett funktionsbaserat index för att stödja den frågan. I så fall är du förmodligen bättre ställd med nycklarna i optimerarens beslut med LIKE-formuleringen.



  1. Finns det säkerhetsrisker med Spotlight Cloud Monitoring?

  2. Hur man eliminerar icke-arbetstid i Oracle

  3. Hur man använder _COUNT i BaseColumns

  4. String -> java.util.Date -> java.sql.Date (med tidsstämpel)