News zu Oracle

SQL Tuning Tipp: Entfernen über­flüs­si­ger Indizes

Indizes be­schleu­ni­gen auf der einen Seite zwar selektive Da­ten­zu­grif­fe. Auf der anderen Seite ver­ur­sa­chen sie aber auch Overhead bei DML-Ope­ra­tio­nen, belegen Platz in der Datenbank und im Backup sowie ver­ur­sa­chen zum Teil si­gni­fi­kan­te La­de­zei­ten beim Im­por­tie­ren von Dumps. Wenn gleich die Ein­spa­rung von Indizes in der Regel keinen Per­for­mance-Boost ver­ur­sacht, sollte mit In­di­zie­rung so sparsam wie möglich um­ge­gan­gen 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 ab­ge­han­delt 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')

Ver­zich­tet man jedoch auf den Index EMP_NAME_IX, der eine Obermenge von EMP_LAST_NAME_IDX ist, kann immer noch von der In­di­zie­rung pro­fi­tiert werden – auf Kosten eines etwas höheren CPU-Aufwandes für das nun zu­sätz­lich er­for­der­li­che 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. Per­for­mance Tuning aus unserem News Bereich. 
icon-arrow_right_medium-violet-blue.svg

Share this article

Facebook 
Twitter 
LinkedIn 
XING 
WhatsApp 
Email