Indizes beschleunigen auf der einen Seite zwar selektive Datenzugriffe. Auf der anderen Seite verursachen sie aber auch Overhead bei DML-Operationen, belegen Platz in der Datenbank und im Backup sowie verursachen zum Teil signifikante Ladezeiten beim Importieren von Dumps. Wenn gleich die Einsparung von Indizes in der Regel keinen Performance-Boost verursacht, sollte mit Indizierung so sparsam wie möglich umgegangen werden.
Beispiel: Die Tabelle EMPLOYEES enthält zwei Indizes
EMP_NAME_IX auf den Spalten LAST_NAME und FIRST_NAME und
EMP_LAST_NAME_IDX auf der Spalte LAST_NAME
Eine Query auf LAST_NAME und FIRST_NAME würde natürlich ideal bedient vom Index EMP_NAME_IX. Die komplette WHERE-Klausel kann über den Index abgehandelt werden:
SELECT *
FROM employees
WHERE last_name = 'Gates' AND first_name = 'Timothy';
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 69 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 1 | 69 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | EMP_NAME_IX | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("LAST_NAME"='Gates' AND "FIRST_NAME"='Timothy')
Verzichtet man jedoch auf den Index EMP_NAME_IX, der eine Obermenge von EMP_LAST_NAME_IDX ist, kann immer noch von der Indizierung profitiert werden – auf Kosten eines etwas höheren CPU-Aufwandes für das nun zusätzlich erforderliche Filtern von
FIRST_NAME:
SELECT *
FROM employees
WHERE last_name = 'Gates'
AND first_name = 'Timothy';
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 69 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 1 | 69 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | EMP_LAST_NAME_IDX | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("FIRST_NAME"='Timothy')
2 - access("LAST_NAME"='Gates')
Share this article
Sie müssen den Inhalt von reCAPTCHA laden, um das Formular abzuschicken. Bitte beachten Sie, dass dabei Daten mit Drittanbietern ausgetauscht werden.
Mehr InformationenSie sehen gerade einen Platzhalterinhalt von Facebook. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr Informationen