String-Theorie

Seite 3: LIKE und Indizes

Inhaltsverzeichnis
Mehr Infos

LIKE und Indizes

In der Regel kann eine Datenbank keinen Index für LIKE-Abfragen nutzen, die mit einer Wildcard beginnen. Mit ein wenig Programmierarbeit lassen sie sich dennoch beschleunigen. Voraussetzung ist, dass die Datenbank funktionale Indizes beherrscht. Sie verwalten nicht den Spalteninhalt selbst, sondern den von einer Funktion zurückgegebenen Wert. Benutzt die Abfrage dieselbe Funktion, kann die Datenbank den Index verwenden.

Die Idee ist nun, die Wildcard für die Abfrage von vorne nach hinten zu bringen. Es braucht also als Grundlage für den Index eine Funktion, die eine Zeichenkette umdreht. Die SQL-Abfrage wendet diese Funktion ebenfalls auf beide Seiten des LIKE-Operators an. Im günstigsten Fall bietet die Datenbank bereits mit REVERSE eine solche Funktion. Alternativ kann man sie analog zum Code in Listing 10 (s.u.) selbst schreiben. Anschließend erzeugt

CREATE INDEX ix_ename_reverse ON emp (string_reverse(ename)) 

den nötigen Index, und

SELECT * FROM emp WHERE (string_reverse(ename)) 
LIKE string_reverse('%OTT')

liefert alle mit „OTT“ endenden Einträge in der Spalte EMP.

Steht die Wildcard in der Abfrage allerdings sowohl am Anfang als auch am Ende, nützt dieser Trick nichts. Ein Volltextindex kann hier helfen. Ihn bieten alle größeren Datenbanksysteme.

Listing 10: Funktion zum Umdrehen von Strings

CREATE OR REPLACE FUNCTION string_reverse(p_string IN VARCHAR2)
RETURN VARCHAR2 DETERMINISTIC IS
l_string VARCHAR2(4000) := '';
BEGIN
FOR i IN REVERSE 1..LENGTH(p_string) LOOP
l_string := l_string || SUBSTR(p_string, i, 1);
END LOOP;
RETURN l_string;
END string_reverse;