Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ist substr oder LIKE in Oracle schneller?

Unter der Annahme, dass maximale Leistung das Ziel ist, würde ich idealerweise SUBSTR(my_field,1,6) wählen und erstellen Sie einen funktionsbasierten Index zur Unterstützung der Abfrage.

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

Wie andere darauf hinweisen, SUBSTR(my_field,1,6) wäre nicht in der Lage, einen regulären Index für MY_FIELD zu verwenden . Die LIKE-Version verwendet möglicherweise den Index, aber die Kardinalitätsschätzungen des Optimierers sind in diesem Fall im Allgemeinen ziemlich schlecht, sodass es sehr wahrscheinlich ist, dass entweder kein Index verwendet wird, wenn dies hilfreich wäre, oder ein Index verwendet wird, wenn ein Tabellenscan vorzuziehen wäre. Das Indizieren des tatsächlichen Ausdrucks gibt dem Optimierer viel mehr Informationen, mit denen er arbeiten kann, sodass es viel wahrscheinlicher ist, den Index richtig auszuwählen. Jemand, der klüger ist als ich, kann vielleicht einen Weg vorschlagen, Statistiken zu virtuellen Spalten in 11g zu verwenden, um dem Optimierer bessere Informationen für die LIKE-Abfrage zu geben.

Wenn 6 eine Variable ist (d. h. Sie möchten manchmal nach den ersten 6 Zeichen suchen und manchmal nach einer anderen Zahl), können Sie wahrscheinlich keinen funktionsbasierten Index zur Unterstützung dieser Abfrage erstellen. In diesem Fall sind Sie wahrscheinlich besser dran mit den Launen der Entscheidungen des Optimierers mit der LIKE-Formulierung.