News zu Oracle

SQL Tuning Tipp: Entfernen überflüssiger Indizes

Indizes beschleu­nigen auf der einen Seite zwar selektive Datenzugriffe. Auf der anderen Seite verur­sachen sie aber auch Overhead bei DML-Operationen, belegen Platz in der Datenbank und im Backup sowie verur­sachen zum Teil signi­fi­kante Ladezeiten beim Importieren von Dumps. Wenn gleich die Einsparung von Indizes in der Regel keinen Performance-Boost verur­sacht, 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 profi­tiert werden – auf Kosten eines etwas höheren CPU-Aufwandes für das nun zusätzlich erfor­der­liche 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')
Hier findest du weitere Posts zu den Themen SQL Tuning bzw. Performance Tuning aus unserem News Bereich. 
icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email