Es gibt noch eine weitere Gruppe von Verschleierungen, die zwar schlau sind, aber die Indexnutzung unterbinden können. Anstatt logischer Ausdrücke verwendet man dabei Mathematik.
Kann diese Abfrage wohl einen Index auf NUMERIC_NUMBER
nutzen?
SELECT numeric_number
FROM table_name
WHERE numeric_number - 1000 > ?
Oder kann diese Abfrage vielleicht einen Index auf A oder B verwenden?
SELECT a, b
FROM table_name
WHERE 3*a + 5 = b
Betrachten wir diese Fragen aus dem Blickwinkel eines Datenbankherstellers. Würden wir wohl einen Gleichungslöser mit einbauen? Die meisten Hersteller beantworten diese Frage mit einem klaren „Nein!“ Daher wird bei den Beispielen oben kein Index benutzt.
Hinweis in eigener Sache
Ich biete SQL Schulungen, Optimierung und Beratung an. Auch der Kauf meines Buches „SQL Performance Explained“ (ab €9,95) unterstützt meine Arbeit an dieser Webseite.
Natürlich kann man mit dieser Methode auch absichtliche Verstümmelungen durchführen. Ähnlich, wie wir es zuvor für LIKE
-Abfragen getan haben. Dafür kann man zum Beispiel Null addieren:
SELECT numeric_number
FROM table_name
WHERE numeric_number + 0 = ?
Mit einem Funktions-basierten Index kann man all diese Beispiele indizieren. Ja sogar das zweite Beispiel kann man indizieren, wenn man die Mathematik schlau anwendet und die Bedingung wie eine Gleichung umformt:
SELECT a, b
FROM table_name
WHERE 3*a - b = -5
Man bringt also alle Tabellenspalten auf die eine Seite, die Konstanten auf die andere. Für den linken Teil der Gleichung kann man dann einen Funktions-basierten Index anlegen:
CREATE INDEX math ON table_name (3*a - b)