DOAG Index Tuning 2010-1
DOAG Index Tuning 2010-2
DOAG Index Tuning 2010-3
DOAG Index Tuning 2010-4
DOAG Index Tuning 2010-5
Ausführliche Syntax: CREATE [UNIQUE] INDEX [<owner>.]<index_name> ON TABLE [<owner>.]<tab_name> (<spalten_name> [ASC DESC], <spalten_name> [ASC DESC],...) [LOGGING NOLOGGING] [ONLINE] [TABLESPACE <tablespace_name>] [COMPRESS <int> NOCOMPRESS] [NOSORT] [PARALLEL <int> NOPARALLEL] [PCTFREE <int>] [PCTUSED <int>] [INITRANS <int>][maxtrans <int>] [STORAGE ([INITIAL <int>[k M]] [NEXT <int>[k M]] [MINEXTENTS <int>] [MAXEXTENTS <int>]] )]; Stichwörter: Index Syntax DOAG Index Tuning 2010-6
DOAG Index Tuning 2010-7
Hinweis: Wenn Der Datensatz "ALLEN" gesucht wird geht der Index wie folgt vor: Lese Index-Start-Block (1) Buchstaben A-J befindet sich im Unterblock 2 Buchstabe A befindet sich im Leaf-Block 4 Datensatz "ALLEN" hat die folgende ROWID AABJJHTFGG... Aus der Rowid kann die Block-Nummer, datei-nummer und Zeilen-Nummer des Datensatz ermittelt werden Der Datenblock wird gelesen Fertig Dafür waren nur 3 Index und 1 Datenblock (+ Segmentheader Block) notwendig Stichwörter: Index B-Tree DOAG Index Tuning 2010-8
Hinweis: Index zu groß? SELECT owner, segment_name, bytes/1024/1024 FROM dba_segments WHERE segment_type='index' AND owner NOT IN ('SYS','SYSTEM') ORDER BY 3 DESC; Welcher Index wird nicht benutzt? SELECT * FROM dba_objects WHERE object_id IN (SELECT i.obj# FROM sys.icol$ i, sys.col_usage$ c WHERE i.bo# =c.obj#(+) AND i.col# =c.intcol#(+) AND c.obj# IS NULL ) AND owner NOT IN ('SYS','SYSTEM','OUTLN','WMSYS','XDB','EXFSYS','SYSMAN','HR','OLAPSYS', 'MDSYS','FLOWS_030000','OE','IX','DBSNMP','PERFSTAT','CTXSYS','ORDDATA','ORDS YS','APEX_030200'); DOAG Index Tuning 2010-9
Hinweis: Prüfen Sie, welche Objekte auf welchem Tablespace liegen mit folgendem Select: SELECT tablespace_name, segment_type, COUNT(*) FROM dba_segments WHERE owner='scott' GROUP BY tablespace_name, segment_type; Verschieben Sie Indizes ggf. mittels: ALTER INDEX scott.my_index REBUILD ONLINE /* ONLINE geht nur in EE */ TABLESPACE my_index_tbs; DOAG Index Tuning 2010-10
Hinweis: EMPNO Lieblingsfarbe 7839 rot 7840 grün 7841 gelb 7842 blau ROWID BITMAP INDEX AABCDFJKMNDF 00 AABCDFJKMNDG 01 AABCDFJKMNDH 10 AABCDFJKMNDI 11 Empfohlene Hints für Bitmap-Indizes: INDEX_COMBINE AND_EQUAL Stichwörter: Bitmap Index DOAG Index Tuning 2010-11
Weitere Nachteile: Für OLTP Transaktionen ist der Index ungeeignet. Beispiel: CREATE TABLE bm_test AS SELECT rownum nr,decode(floor(dbms_random.value(0,4)),0, 'Nord',1,'Süd',2,'Ost',3,'West') region FROM dba_objects; -- auf 1 Mio Zeilen auffüllen CREATE BITMAP INDEX bm_ind ON bm_test(region) TABLESPACE indx; EXEC dbms_stats.gather_index_stats( ownname=>'scott',indname=>'bm_ind'); SELECT blevel, leaf_blocks, distinct_keys, avg_leaf_blocks_per_key FROM DBA_INDEXES WHERE index_name='bm_ind'; => 1,170,4,42 (Bitmap Index) => 2,4440,4,1110 (Für Nonuniqe Index, >Faktor 26 ) > SELECT region, count(*) FROM bm_test GROUP BY region; REGION COUNT(*) ------ -------- Nord 1915 Ost 1932 Süd 1882 West 1881 Stichwörter: Bitmap Index Beispiel DOAG Index Tuning 2010-12
Nachteile Keine Suchbereiche bei Abfragen möglich (BETWEEN 10 AND 20) Index-Blöcke werden nur ca. zu 75% ausgelastet, dadurch werden Fast Full Index Scans langsamer. Hinweis: Nicht dokumentiert ist folgender Index-Typ: CREATE INDEX scott.job_r_ix ON scott.emp REVERSE( job); Folgender Select erzeugt dann keinen FULL Table Scan: SELECT * FROM scott.emp WHERE ename LIKE REVERSE('R%'); Stichwörter: Reverse Key Index DOAG Index Tuning 2010-13
DOAG Index Tuning 2010-14
Weitere Tipps: DBMS_STATS.GATHER_INDEX_STATS regelmäßig durchführen. (Besonders nach einem Index-Rebuild) Indizes nur auf Spalten legen, die in der WHERE-Bedingung benutzt werden. Index in einem eigenen Tablespace ablegen, oder bei partitionierten Tabellen auch auf mehrere Tablespaces verteilen. Die Option NOSORT kann verwendet werden die Index-Einträge bereits sortiert sind. Dies spart eine Menge Zeit. Die Option PARALLEL wird verwendet wenn Multiprozessor-Maschinen und mehrere Platten zur Verfügung stehen DOAG Index Tuning 2010-15
Beispiel für: CREATE INDEX marco.brd_telefon_ix ON MARCO.BRD( CASE WHEN vorwahl='089' THEN vorwahl ELSE NULL END, CASE WHEN vorwahl='089' THEN telefon ELSE NULL END); exec dbms_stats.gather_index_stats('marco','brd_telefon_ix') SELECT dazu: SELECT * FROM MARCO.BRD WHERE (CASE WHEN vorwahl='089' THEN vorwahl ELSE NULL END)='089' AND (CASE WHEN vorwahl='089' THEN telefon ELSE NULL END) LIKE '679090%'; Ausführungsplan dazu: DOAG Index Tuning 2010-16
DOAG Index Tuning 2010-17
Stichwörter: Index Compression DOAG Index Tuning 2010-18
DOAG Index Tuning 2010-19
DOAG Index Tuning 2010-20
DOAG Index Tuning 2010-21
Hinweis: In der Spalte opt_cmpr_count steht die Anzahl der Spalten auf die ein compress gesetzt werden sollte: Beispiel: Index auf a,b,c, opt_cmpr_count=2 Empfehlung: ALTER INDEX i REBUILD ONLINE COMPRESS 2; In der Spalte opt_cmpr_pctsave steht die Prozentzahl an Platz die für die Speicherung des Index eingespart werden kann Stichwörter: Index Reorg DOAG Index Tuning 2010-22
DOAG Index Tuning 2010-23
DOAG Index Tuning 2010-24
DOAG Index Tuning 2010-25
DOAG Index Tuning 2010-26
Hinweis: Anstelle der Option CASCADE kann auch COMPACT verwendet werden, dann wird nur reorganisiert, der überflüssige Speicher jedoch nicht freigegeben. Stichwörter: Segment Shrink DOAG Index Tuning 2010-27
DOAG Index Tuning 2010-28
Hinweis: Ein Rebuild ONLINE ist bei folgenden Indizes bisher nicht möglich (Stand Jan 2005): Function Based Index Reverse Kex Index Kex Compressed Index Zweitindizes auf Index Organized Tables Bitmap Indizes auf IOT Stichwörter: Index Tuning DOAG Index Tuning 2010-29
DOAG Index Tuning 2010-30
DOAG Index Tuning 2010-31
Hinweis: Auschnitt aus dem Beispielskript: REM RESET Skript /opt/reset_perf.sql SET TIMING OFF DROP INDEX marco.brd_ix1; HOST rman target=/ cmdfile=/opt/rman_del.rma STARTUP FORCE ALTER SYSTEM SWITCH LOGFILE; ALTER SYSTEM CHECKPOINT; select 'Startzeit:' to_char(sysdate,'dd.mm.yyyy HH24:MI:SS'),log_mode FROM V$database; SET TIMING ON @&&res_script CREATE INDEX marco.brd_ix1 ON marco.brd(nachname) TABLESPACE tuning_ind_tbs; @&&res_script CREATE INDEX marco.brd_ix1 ON marco.brd(nachname) TABLESPACE tuning_ind_tbs NOLOGGING; @&&res_script CREATE INDEX marco.brd_ix1 ON marco.brd(nachname) TABLESPACE tuning_ind_tbs COMPRESS; @&&res_script CREATE INDEX marco.brd_ix1 ON marco.brd(nachname) TABLESPACE tuning_ind_tbs PARALLEL 4; @&&res_script CREATE INDEX marco.brd_ix1 ON marco.brd(nachname) TABLESPACE tuning_ind_tbs ONLINE; DOAG Index Tuning 2010-32
DOAG Index Tuning 2010-33
DOAG Index Tuning 2010-34
DOAG Index Tuning 2010-35
DOAG Index Tuning 2010-36