Oracle Index Tuning &Admin

Ähnliche Dokumente
10 Gründe warum Ihr Index nicht verwendet wird

Oracle Database 12c Was Sie immer schon über Indexe wissen wollten

Tabellen und Indizes Reorganisieren, aber wann?

Index Rebuild. DOAG Konferenz , Nürnberg DOAG Konferenz , Nürnberg Martin Hoermann Martin Hoermann

Index Rebuild. DOAG Konferenz , Nürnberg. Martin Hoermann

Inhalt. 1. Indextypen B*Baum-Index Reversed Key Index Bitmap Index Funktionsbasierter Index

Neuerungen in Marco Patzwahl MuniQSoft GmbH Unterhaching

Übersicht der wichtigsten MySQL-Befehle

Oracle 9i Einführung Performance Tuning

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

Indizes B+Bäume in Oracle. Jörg Winkler

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

SQL structured query language

Automatisierte Datenmigration mit dynamischen SQL

Übung PL/SQL Trigger Lösungen

DOAG München Die etwas anderen Oracle Performance-Tipps. Marco Patzwahl

Oracle Datenbank - Tuning

Oracle 9i Einführung Performance Tuning

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Datenbank und Tabelle mit SQL erstellen

Parallele Programmierung in SQL und PL/SQL. Peter Bekiesch Dierk Lenz DOAG 2011 Konferenz und Ausstellung 17. November 2011

3 Query Language (QL) Einfachste Abfrage Ordnen Gruppieren... 7

Seminar 2. SQL - DML(Data Manipulation Language) und. DDL(Data Definition Language) Befehle.

Erzeugung und Veränderung von Tabellen

DOAG Regionaltreffen TABLE REORG. Klaus Reimers. Leiter Beratung & Entwicklung, ORDIX AG, Paderborn

Oracle 10g Einführung

Abfragen (Queries, Subqueries)

Erzeugen von Constraints

Oracle Datenbank 11g Advanced Compression Option

DOAG ORACLE LogMiner

Funktion definieren Gibt Summe der Gehälter zurück. Aufruf in einem SQL-Statement

Optimiertes Laden in die F-Fakten-Tabelle des SAP BW

Es geht also im die SQL Data Manipulation Language.

Datenbanken II Speicherung und Verarbeitung großer Objekte (Large Objects [LOBs])

Oracle Advanced Compresion 10g versus 11g

4. Objektrelationales Typsystem Kollektionstypen. Nested Table

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

Übung 01 Tabellen erstellen

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

Naxtron GmbH Schlosstalstrasse Winterthur. Subject. New Features Oracle 9i Tuning. Edo Bezemer. Author

Oracle 9i Einführung Performance Tuning

5.8 Bibliotheken für PostgreSQL

Datenbank Objekte (Tabellen, Segemente, Extents, Blöcke)

SQL (Structured Query Language) Schemata Datentypen

ISU 1. Ue_08/02_Datenbanken/SQL. 08 Datenbanken. Übung. SQL Einführung. Eckbert Jankowski.

Dipl. Inf. Eric Winter. PostgreSQLals HugeData Storage Ein Erfahrungsbericht

<Insert Picture Here> Security-Basics. Privilegien, Rollen, SQL und PL/SQL - inkl. 12c-Update. Carsten Czarski, ORACLE Deutschland B.V. Co.

Geodaten und Karten in APEX

Inhaltsverzeichnis. Vorwort... 11

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Kuriositäten in der Oracle-Datenbank

Speed up your Query Strategien zur Optimierung von SQL-Queries. Juni 2012 Ulrike Brenner

Introduction to Data and Knowledge Engineering. 6. Übung SQL

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

Relationales Datenbanksystem Oracle

Hochschule Karlsruhe Technik und Wirtschaft Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

... Datenintegrität verwalten

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #3. SQL (Teil 1)

Prozedurale Datenbank- Anwendungsprogrammierung

Dieser Foliensatz darf frei verwendet werden unter der Bedingung, dass diese Titelfolie nicht entfernt wird.

Arbeit mit zusammengesetzten Datentypen

Datenversionierung in Business-Anwendungen

Views in SQL. 2 Anlegen und Verwenden von Views 2

Bedingungen über Werte Statische Integrität. CHECK-Klausel

Fehlerbehandlung mittels DML Error Logging Business Intelligence Andreas Buckenhofer,

ACCESS SQL ACCESS SQL

Historisierung und Versionierung

Advanced SQL verstehen und einsetzen SQL-Implementierungen kennen und bewerten

Inhalt. Ein Einführung in die Nutzung von SQL-Datenbanken am Beispiel Oracle. Daten und Tabellen - ein Beispiel. Daten und Tabellen - Normalisierung

Garten - Daten Bank. - survival pack -

MIN oder MAX Bildung per B*Tree Index Hint

Editions - Upgrade im laufenden Betrieb

Einstieg in das SQL- und Datenbanktuning Loblied auf den Tabellen-Index!

Datenbankstatistiken im Griff mit DBMS_STATS. DOAG 2012 Konferenz + Ausstellung Nürnberg 21. November 2012

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und combit GmbH Untere Laube Konstanz

Projektbericht Gruppe 12. Datenbanksysteme WS 05/ 06. Gruppe 12. Martin Tintel Tatjana Triebl. Seite 1 von 11

Beispiel zur referentiellen Integrität

Microsoft Access 2010 SQL nutzen

MySQL. MySQL ist ein Datenbanksystem. Es besteht aus einem zentralen Server und aus (mehreren) Clients. Es benutzt einen Dialekt der Sprache SQL.

Einführung in SQL. 1. Grundlagen SQL. Structured Query Language. Viele Dialekte. Unterteilung: i. DDL (Data Definition Language)

Zünde den Turbo-Boost! (LOB-Migration beschleunigt)

Klausur PI Datenbanken II vom Name: Praktische Informatik (Krägeloh)

PostgreSQL unter Debian Linux

Index-Reorganisationen Mythen und Fakten. Michael A. Istinger EDV-Beratung Istinger

Erstellen und Verwalten von Tabellen

Kurs. Teil 7 UNDO-Management. Universität Hannover. Agenda. Einführung. Nutzung RBS Oracle 9i Einführung Performance Tuning.

Kapitel 7 Datenbank-Tuning

Oracle 12c: Neuerungen in PL/SQL. Roman Pyro DOAG 2014 Konferenz

SQL. SQL: Structured Query Language. Früherer Name: SEQUEL. Standardisierte Anfragesprache für relationale DBMS: SQL-89, SQL-92, SQL-99

Transkript:

Oracle Index Tuning &Admin Marco Patzwahl MuniQSoft GmbH München-Unterhaching Schlüsselworte: SQL, PL/SQL, DBA Zusammenfassung Indizes sind ein erprobtes Mittel, um SQL-Abfragen zu beschleunigen. Aber haben sie auch Nachteile? Welche Performance geht durch Indizes verloren und welche Indizes sind die schnellsten? Einleitung Ein Index indiziert eine oder mehrere Spalten einer Tabelle. Bei Abfragen auf indizierte Spalten werden die dazu passenden Zeilen schneller gefunden. Bei Inserts/Updates/Deletes auf indizierten Spalten wird die Transaktion jedoch verlangsamt! Vorteile von Indizes: u.u. schneller Zugriff bei Select, Update und Delete Sortierungen schneller COUNT(*) schneller bei Bitmap Index oder indizierten NOT NULL Spalten Nachteile von Indizes Längere Verarbeitungszeit bei Insert/Update/Delete Höherer Pflegeaufwand durch Index (Resourcenverbrauch) Index-Blöcke können Cache dicht machen (und Tabellen-Blöcke aus dem Cache vertreiben) Indexerstellung Ein Index kann auf jede beliebige Spalte einer Tabelle (Ausnahme Long und Lob) gesetzt werden. Einspaltige oder mehrspaltige Indizes sind möglich. Syntax: CREATE [UNIQUE] INDEX [<owner>.]<index_name> ON [<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>] [INITRANS <int>];

Besonderheiten des Index im Vergleich zur Tabelle: Es gibt keinen Default Index Tablespace. Ein Index landet (ohne Angabe) im Default Tablespace des Benutzers PCTFREE hält bei Indizes den Platz für Updates und INSERTS frei! Es gibt keinen internen Update auf einen Index-Wert. Stattdessen wird der Wert gelöscht und neu eingefügt Ein Indexeintrag darf maximal 78% eines Blocks betragen, sonst bekommt man den Fehler (8k Blockgröße): SQL-Fehler: ORA-01450: Maximale Schlüssellänge (6398) überschritten Maximal 32 Spalten (Bitmap Index: 30) lassen sich von einem Index erfassen Bitmap Index Voraussetzungen: Enterprise oder Personal Edition Bei Tabellen mit geringer Insert und Update Aktivität auf indizierte Spalten (Data Warehouse) Vorteile: Bei größeren Datenmengen mit geringer Kardinalität (z. B. 80 Mio. Einwohner, Bitmap Index auf Spalte Bundesländer (16)) Schneller, wenn Abfragen aus mehreren WHERE- Bedingungen bestehen, die mit OR oder AND verknüpft sind Bei Read-Only Tabellen besser Benötigen weniger Speicherplatz als B*Indizes, wenn Kardinalität klein (teilweise nur 2% von B*Indizes) Count Funktion ist schneller Nachteile: INSERT, UPDATE und DELETE dauern länger. Da beim Ändern eines Wertes alle Zeilen mit diesem Wert gesperrt werden, kann es leichter zu Deadlocks kommen Index-Werte werden komprimiert gespeichert. Bei Änderungen muss zuerst dekomprimiert, danach manipuliert, der Index-Zweig neu aufgebaut und wieder komprimiert werden Syntax (verkürzt): CREATE BITMAP INDEX [<owner>.]<index_name> ON [<owner>.]<tab_name> (<col_name> [ASC DESC], <col_name> [ASC DESC]...) [TABLESPACE <tbs_name>]; Beispiel: CREATE TABLE scott.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 CREATE BITMAP INDEX scott.bm_ind ON scott.bm_test(region) TABLESPACE indx;

BEGIN dbms_stats.gather_index_stats( ownname=>'scott',indname=>'bm_ind'); END; / 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 ) Der Bitmap Index ist also Faktor 26 kleiner als ein normaler B-Tree Index. Reverse Key Index Beschreibung: Ein Reverse Key Index indiziert die Werte rückwärts So wird z.b. aus 123 der Wert 321 Vorteile: Bei Primary Key Erzeugung durch Sequenzen sind Inserts schneller Verteilt die Index-Einträge auf verschiedene Index-Blöcke und damit gibt es weniger Sperrkonflikte Vorteilhaft in einer RAC-Umgebung Nachteile: Keine Index Range Scans möglich Syntax: CREATE INDEX [<owner>.]<index_name> ON [<owner>.]<tab_name> (<col_name> [ASC DESC], <col_name> [ASC DESC]...) [TABLESPACE <tbs_name>] REVERSE; Beispiele: CREATE INDEX scott.brd_ri ON scott.telefonbuch (kunden_id) TABLESPACE index_tbs REVERSE; Index-Tuning Index wird bei Primary Key/ Unique Key automatisch angelegt. Es ist günstiger, zuerst den Unique Index und dann den Constraint auf diese Spalte anzulegen. NOLOGGING schreibt nur einen geringen Bruchteil der Informationen in die Redologdatei. Im Fall eines Server-Crashs, wird der Index jedoch unbrauchbar. CREATE TABLE t (id NUMBER); CREATE UNIQUE INDEX i ON t(id) TABLESPACE indx_tbs NOLOGGING;

ALTER TABLE t ADD CONSTRAINT pk PRIMARY KEY(id); Alternativ kann wenigstens der Tablespace des Index bei Erzeugen des Constraints angegeben werden: CREATE TABLE t (id NUMBER CONSTRAINT pk PRIMARY KEY USING INDEX TABLESPACE ts_idx); Achtung: Wenn der Index eigenständig angelegt wurdem bleibt er Drop auf den Primary Key bestehen. IM anderen Falle wird er mitgelöscht. Index Tuning durch Selektion Sie können entscheiden, dass nur bestimmte Werte indiziert werden sollen. Nur nach diesen Werten kann dann natürlich über den Index gesucht werden. Beispiel: Nur Münchner Telefonnummern sollen indiziert werden: CREATE INDEX scott.brd_tel_ix ON scott.brd( CASE WHEN vorwahl='089' THEN vorwahl ELSE NULL END); Originalgröße des Index (ohne Selektion): 2GB Größe des Index (mit Selektion): 16MB SELECT dazu (der den Index dann auch benutzt): SELECT * FROM scott.brd WHERE (CASE WHEN vorwahl='089' THEN vorwahl ELSE NULL END)='089' Compress Option Mit der COMPRESS Option können führende Index-Spalten, die viele gleiche Werte besitzen, platzsparend im Index untergebracht werden: CREATE INDEX scott.i ON scott.emp(deptno,job) COMPRESS 2; Sie können vom bestehenden Index eine Analyse erzeugen, um zu sehen, wie viel Prozent ein COMPRESS einsparen würde: ANALYZE INDEX scott.i VALIDATE STRUCTURE; SELECT opt_cmpr_count,opt_cmpr_pctsave FROM index_stats; Nutzen der Compression: Hier werden gleiche Index Einträge komprimiert. CREATE TABLE t (x VARCHAR2(100),y VARCHAR2(100)); INSERT INTO t SELECT object_type,status FROM dba_objects; CREATE INDEX i ON t(x,y) COMPRESS 2; Folgende Indizes wurden erzeugt: i(x,y) 100 Leaf Blocks i(x)+i(y) 77+66 = 143 Leaf Blocks i(x,y) compress 2 43 Leaf Blocks i(x,y) compress 1 67 Leaf Blocks

Index-Größe abschätzen: Mit folgendem Skript lässt sich die Größe (hier in MB) abschätzen, die ein Index bei einer Erstellung benötigen würde. Hinweis: Compress wird bei Indexberechnung nicht berücksichtigt. DECLARE ub NUMBER; ab NUMBER; s CLOB; BEGIN s:='create INDEX x.x ON scott.bug ("TEXTID", "LOAD", "GEO") TABLESPACE USERS'; dbms_space.create_index_cost(s, ub, ab); dbms_output.put_line('used MB: ' round(ub/1024/1024,2); dbms_output.put_line('alloc MB:' round(ab/1024/1024,2); END; / Index-Reorg (1) Der Platz in den Index-Blöcken wird nach einem Delete u.u. nicht mehr verwendet. Indizes wachsen nach vielen Deletes und anschließenden Inserts stark an und sollten häufiger reorganisiert werden. ANALYZE INDEX <owner>.<indx> VALIDATE STRUCTURE; SELECT name, del_lf_rows, lf_rows - del_lf_rows lf_rows_used, to_char(del_lf_rows / (lf_rows)*100,'999.99999') ratio, OPT_CMPR_COUNT,OPT_CMPR_PCTSAVE FROM index_stats where name = upper('<indx>'); Wenn die Anzahl der gelöschten Zeilen 10-15% beträgt, sollte der Index reorganisiert werden (Metalink Note 30405.1): ALTER INDEX <owner>.<indx> REBUILD ONLINE; Index-Reorg (2) Eine andere Möglichkeit ist, das Package dbms_space anzuwenden. Das Package kann die Freelist der Index-Blöcke auslesen und damit ihren Füllpegel in den folgenden Bereichen bestimmen: <25% <=50% <=75% <=100% Ein Skript mit einer Pipelined Funktion, die diese Analyse durchführt, ist beim Referenten erhältlich. Index-Statistiken Sie sollten Index Statistiken nur mit dem Package DBMS_STATS (.GATHER_INDEX_STATS,.GATHER_SCHEMA_STATS oder.gather_database_stats) erzeugen Die folgenden Aufrufe werden nicht mehr empfohlen: ANALYZE INDEX idx COMPUTE STATISTICS; ANALYZE INDEX idx ESTIMATE STATISTICS ; CREATE INDEX idx ON t(c) COMPUTE STATISTICS;

ALTER INDEX idx REBUILD COMPUTE STATISTICS; Bereits seit 10g werden Statistiken bei einem CREATE INDEX oder ALTER INDEX Befehl automatisch erzeugt! Ergebnisse der Performance-Messungen: NOLOGGING beschleunigt die Index-Erstellung, birgt aber Gefahren Parallelisierung bringt nicht zwingend etwas COMPRESS kostet bei der Erstellung sogar weniger Zeit und man erhält einen schlanken Index ONLINE (nur in der EE) kostet keine zusätzlich Zeit, die Tabelle ist aber bereits während der Indexerstellung verfügbar Update und Delete sind ca. Faktor 4 langsamer. Ein Insert ist Faktor 14 langsamer!!! Kontaktadresse: Marco Patzwahl MuniQSoft GmbH Grünwalder Weg 13 a D-82008 Unterhaching Telefon: +49(0) 89-6228 6789-0 Fax: +49(0)89-6228 6789-50 E-Mail m.patzwahl@muniqsoft.de Internet: http://www.muniqsoft.de