Der Index auf LAST_NAME
hat die Abfrage zwar erheblich beschleunigt, setzt aber voraus, dass die Groß- und Kleinschreibung bei der Suche übereinstimmt. Dieser Abschnitt zeigt, wie man diese Einschränkung durch Funktions-basierende Indizierung aufheben kann, ohne dabei Performance einzubüßen.
- Db2 (LUW)
Db2 auf zOS unterstützt funktions-basierte Indizierung seit einiger Zeit, aber erst seit Version 10.5 auf LUW. Benutzer-definierte Funktionen können in Indizes nicht verwendet werden.
Als Alternative kann man der Tabelle eine neue Spalte hinzufügen, die das Ergebnis des Funktionsausdruckes enthält. Diese Spalte muss man bei Änderungen unbedingt aktuell halten. Zum Beispiel mit einem Datenbank-Trigger. Die neue Spalte kann man dann ganz normal indizieren. In der
where
-Klausel verwendet man dann einfach die neue Spalte (ohne der Funktion).- MySQL
MySQL Suchen ignorieren die Groß- und Kleinschreibung per Default. Das kann man allerdings auf Spaltenebene abstellen. Ab Version 5.7 kann MySQL generierte Spalten indizieren.
Als Alternative kann man bei älteren Versionen der Tabelle eine neue Spalte hinzufügen, die das Ergebnis des Funktionsausdruckes enthält. Diese Spalte muss man bei Änderungen unbedingt aktuell halten. Zum Beispiel mit einem Datenbank-Trigger. Die neue Spalte kann man dann ganz normal indizieren. In der
where
-Klausel verwendet man dann einfach die neue Spalte (ohne der Funktion).- Oracle
Die Oracle Datenbank unterstützt funktions-basierende Indizes seit Release 8i. Virtuelle Spalten (virtual column) wurden mit Version 11g eingeführt.
- PostgreSQL
PostgreSQL unterstützt Indizes auf Ausdrücken seit Version 7.2 teilweise und seit Version 7.4 vollständig (Indexes on Expressions).
- SQL Server
SQL Server unterstützt Berechnete Spalten (Computed Columns), die Indizierbar sind, seit Release 2000.