10 Gründe warum Ihr Index nicht verwendet wird

Ähnliche Dokumente
Warum wird mein Index nicht benutzt?

Oracle Index Tuning &Admin

DOAG Nürnberg Oracle Index Tuning & Administration. Marco Patzwahl

DOAG Index Tuning

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

Oracle 9i Einführung Performance Tuning

Oracle 9i Einführung. Performance Tuning. Kurs. Teil 8 Indizes. Universität Hannover. Installation. Index-Typen. Anhang.

Übersicht der wichtigsten MySQL-Befehle

Neuerungen in Marco Patzwahl MuniQSoft GmbH Unterhaching

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

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

Anfrageoptimierung Ausführungspläne, Hints, Statistikinformationen, IDEs

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

Johannes Ahrends Geschäftsführer CarajanDB GmbH CarajanDB GmbH

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

Row Chaining & Row Migration Alte Bekannte - immer noch aktuell! DOAG 2014 Datenbank Dierk Lenz

Donnerstag, 10. November h00, Musensaal Database. LogMiner im Einsatz. Marco Patzwahl MuniQSoft GmbH, Unterhaching b.

Performance in der Oracle Datenbank von Anfang an

Oracle 9i Einführung. Performance Tuning. Kurs. Teil 10 Stored Outlines. Universität Hannover. Eigenschaften. Migration. Erstellen mit OEM.

Erzeugen von Constraints

Automatisierung von Tabellen- und Index-Reorganisationen

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

Johannes Ahrends Geschäftsführer CarajanDB GmbH

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

Prakt. Datenbankprogrammierung. Sommersemester Was sind Constraints? I,11: Verwendung von Constraints. Festlegung von Constraints

Oracle 9i Einführung Performance Tuning

Online Table Shrink. Freigabe von ungenutztem Speicherplatz. Autor: Ralf Durben, ORACLE Deutschland GmbH

Copyright 2013, Oracle and/or its affiliates. All rights reserved.

Copyright 2013, Oracle and/or its affiliates. All rights reserved.

Datenbank und Tabelle mit SQL erstellen

Im Folgenden möchten wir Ihnen einige Beispiele aufzeigen, wie ALTER TABLE gemäß SQL92 verwendet wird:

Tabellen und Indizes Reorganisieren, aber wann?

Grundlagen von SQL. Informatik 2, FS18. Dr. Hermann Lehner (Material von Dr. Markus Dahinden) Departement Informatik, ETH Zürich

5/14/18. Grundlagen von SQL. Grundlagen von SQL. Google, Facebook und Co. setzen auf SQL. Whatsapp

Indexbasiertes SQL Tuning

Übungsaufgaben mit Lösungen

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

Oracle Indexing Primer

Es geht also im die SQL Data Manipulation Language.

Erzeugung und Veränderung von Tabellen

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

Oracle 10g Einführung

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

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

SQL structured query language

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

ACCESS SQL ACCESS SQL

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

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

Mengen- oder SET-Operatoren fassen das Ergebnis von zwei oder mehreren Teilabfragen zu einem Ergebnis zusammen.

Abfragen (Queries, Subqueries)

Oracle Tuning - Theorie und Interpretation

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

Übung PL/SQL Trigger Lösungen

Inhalt. Dr. Frank Haney

SQL. Datenmanipulation. Datenmanipulationssprache. Ein neues Tupel hinzufügen. Das INSERT Statement

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

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

DBMS_RLS Package Es besteht die Möglichkeit, auf Views oder Tables eine Funktion zu legen, die abhängig von bestimmten Faktoren

1.1 Datenbanken Tabellen SQL und die Befehlseingabe Beispieldatenbank 36

SQL,Teil 2: SELECT. W. Spiegel. Übersicht SELECT. Mehrfache Werte vermeiden: SELECT DISTINCT. Ausgabe ordnen: ORDER BY. Projektion.

Üben von DDL und DML. Ergebnis:

Universität Augsburg, Institut für Informatik WS 2008/2009 Prof. Dr. W. Kießling 23. Nov Dr. A. Huhn, M. Endres, T. Preisinger Lösungsblatt 5

Ich muss gestehen, initial hätte ich mir auch so eine Syntax gewünscht. Bei genauerer Betrachtung stelle ich aber fest:

ORACLE DATENBANKOPTIMIERUNG (BASICS)

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

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

Statistiken unter Oracle9i Voraussetzung für effiziente SQL-Statements

insert, update, delete Definition des Datenbankschemas select, from, where Rechteverwaltung, Transaktionskontrolle

C++ Anwendungskurs Tag 4: Datenbanken Daniela Horn Institut für Neuroinformatik Real-time Computer Vision

Multimedia im Netz Wintersemester 2013/14. Übung 03 (Nebenfach)

DOAG ORACLE LogMiner

Datenbanken Labor, MI : Übung 1 SQL - Abfragen Patrick Lipinski

Backup und Restore von Optimizer Statistiken. Peter Stalder

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

ORACLE. ORACLE-SQL für Profis. Tuning von ORACLE-SQL (Einführung-2) Januar,

Gliederung. 1) Speicherplatz-Zuordnung und -Verwaltung 2) Indizes 3) Explain Plan 4) Join-Operationen 5) Der Optimizer 6) Parallelisieren

MIN oder MAX Bildung per B*Tree Index Hint

Grundlagen der Informatik III ERM-Modell Thema: Grundlagen der Datenbanken

Entspricht dem kartesischen Produkt von zwei oder mehr selektierten Tabellen ohne Join-Bedingung.

Management of Information Systems. Tutorat: Session 3 Einführung in SQL

Folien php/mysql Kurs der Informatikdienste

Partitionierung Indizes und Statistiken

Views erzeugen. Datenbank - Objekte. Wozu braucht man Views? Was ist eine View?

Schnellübersichten. SQL Grundlagen und Datenbankdesign

Labor 3 - Datenbank mit MySQL

Oracle DB 12c: Die In-Memory-Option Oliver Zandner System-Berater für Oracle-DB-Technologien Oracle Hannover. Available July 2014

Erstellen und Verwalten von Tabellen

Die View von der View von der View PERFORMANTES SQL SCHREIBEN

Manuelles Oracle SQL Tuning

select DISTINCT Name, ort From Verkauf; selektiert Name und Ort von Tabelle Verkauf - DISTINCT steht dass keine Zeile mehrfach vorkommt

SQL-Sprachvielfalt. Peter Willadt (Ludwig-Erhard-Schule) SQL-Befehle / 47

SQL Optimizer und SQL Performance

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

Willkommen zum DOAG Regionaltreffen

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

Datenbanken Implementierungstechniken SS2015

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

Transkript:

10 Gründe warum Ihr Index nicht verwendet wird Schlüsselworte Index Benutzung, Index Tuning Einleitung Marco Patzwahl MuniQSoft GmbH München-Unterhaching Ein Index auf einer Tabelle sollte ja eigentlich den Zugriff auf die Tabelle beschleunigen. Was macht man jedoch, wenn der Index zwar vorhanden ist, aber nicht verwendet wird. Der Vortrag soll Ihnen einen Leitfaden an die Hand geben, diese Probleme systematisch zu lösen. Index Tuning Grundlagenregel Nicht jeder Ausführungsplan wird durch Index Zugriff anstelle eines Full Table Scans schneller Das einzige, was zählt ist die Ausführungszeit! Fall 1: Index ist unusable Sie haben einen Index, nur ist der leider unbrauchbar Beispiel: ALTER TABLE emp MOVE; SELECT 1 FROM emp WHERE empno=7369; ALTER INDEX pk_emp REBUILD; SELECT 1 FROM emp WHERE empno=7369; Fall 2: Es gibt keine Statistiken Sie haben keine aktuellen Statistiken BEGIN dbms_stats.gather_index_stats('<owner>','<ind_name>');

END; / Fall 3: Es gibt keine (korrekten) Histogramme Die Werte in der indizierten Spalte treten ganz unterschiedlich oft auf Es liegen keine korrekten Histogramminformationen vor Ermittlung der Verteilungsstatistiken BEGIN dbms_stats.gather_table_stats( '<OWNER>','<TAB_NAME>', method_opt=> 'FOR ALL INDEXED COLUMNS SIZE AUTO); END; / Statistiken dazu stehen in USER_HISTOGRAMS GATHER_PLAN_STATISTICS Fall 4a: Abfrage verwendet LIKE Sie haben die VARCHAR2 Spalte (ename) indiziert SELECT * FROM emp WHERE ename like 'S%'; -- OK SELECT * FROM emp WHERE ename like '%S%'; -- 11.2.0.3 OK Workaround für älter Versionen SELECT /*+ INDEX (emp) */ * FROM emp WHERE ename like '%S%'; Fall 4b: Abfrage verwendet LIKE Sie haben die NUMBER Spalte (sal) indiziert SELECT * FROM emp WHERE sal like '%3%'; -- Geht nicht Function Based Index anlegen

CREATE INDEX emp_sal_fbi ON EMP(to_char(sal)); select 1 from scott.emp where sal like '%3%' Fall 4c: Abfrage verwendet LIKE Sie haben die DATE Spalte (hiredate) indiziert SELECT * FROM emp WHERE hiredate like '%1980%'; -- Geht nicht Function Based Index anlegen CREATE INDEX emp_hiredate_fbi ON EMP(to_char(hiredate,'DDMMYYYY')); select /*+ INDEX(emp) */ * from scott.emp where hiredate like '%1980%' Fall 5: Es wird der falsche Index verwendet Sie haben mehrere Indizes auf der Tabelle, aber der falsche wird verwendet Index Hint mit richtigem Index verwenden SELECT /*+ INDEX(emp,mein_index) */ * FROM emp WHERE sal=3000 and comm=1000; Fall 6: Falsche Reihenfolge indiziert Sie verwenden eine nicht führende Index-Spalte (Index auf ename, sal, hiredate) Reihenfolge ändern oder Index Skip Scan Hint verwenden (Ab 11g kann der Optimizer das automatisch) SELECT /*+ INDEX_SS(emp) */ FROM emp WHERE hiredate=to_date('17.12.80 00:00:00');

Fall 7: Sortierung soll über Index gehen Index liegt auf SAL SELECT * FROM emp ORDER BY sal; Fall 8: Stored Outline / SQL Profil Es gibt eine Stored Outline oder ein SQL-Profil, das der Optimizer vorzieht Prüfen Sie, ob Ihre Query als Stored Outline oder SQL Profil existiert SELECT * FROM dba_outlines; SELECT * FROM dba_sql_profiles; Löschen Sie ggf. die Stored Outline/ SQL Profil BEGIN DBMS_SQLTUNE.DROP_SQL_PROFILE(name => 'mein_sql_profile'); END; DROP OUTLINE <meine_outline>; Fall 9: Initialisierungsparameter Sie haben Initialisierungsparameter verwendet, die eine Index-Verwendung für den Optimizer ungünstig erscheinen lassen. Beispiel: db_file_multiblock_read_count (hoch) optimizer_index_cost_adj (hoch (>100)) optimizer_index_caching (niedrig) Fall 10: Sie haben gar keinen Index

Spalte in der WHERE Bedingung ist gar nicht indiziert Spalte indizieren CREATE INDEX scott.my_ind ON scott.emp(sal) NOLOGGING ONLINE; Bonustrack: Index Grundlagen CREATE INDEX Kommando 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>]; B-Tree Index Aufbau

Was ist Ihr Index Problem? Index zu groß? Lösung: Prüfen durch DBA_SEGMENTS, DBA_INDEXES, SEGMENT_ADVISOR Zu viele Indizes? Lösung: Prüfen durch DBA_IND_COLUMNS Index wird nicht benutzt? Lösung: Prüfen durch Index Monitoring, V$SEGMENT_STATISTICS, COL_USAGE$ Zu wenige Indizes? Lösung: Prüfen durch COL_USAGE$ Index Tuning Tipp: Index Only Access Hier wird die dazugehörige Tabelle nicht mehr benötigt, weil die gesuchten Daten sich alle im Index befinden CREATE TABLE person ( id NUMBER PRIMARY KEY vorname VARCHAR2(200), nachname VARCHAR2(200)); CREATE INDEX person_ix ON person(nachname); SELECT nachname FROM person WHERE nachname like 'A%' Weitere Index-Tuning Tipps: Index wird bei Primary Key / Unique Key automatisch verwendet Es ist günstiger, zuerst den Unique Index und dann den Constraint auf diese Spalte anzulegen 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); Index Tuning durch Selektion Entscheidung, welche Werte alleinig indiziert werden sollen Nur nach diesen Werten kann dann natürlich gesucht werden Beispiel: Nur Münchner Telefonnummern sollen indiziert werden: CREATE INDEX marco.brd_tel_ix ON marco.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 marco.brd WHERE (CASE WHEN vorwahl='089' THEN vorwahl ELSE NULL END)='089' ONLINE Option (nur EE, PE) Wird der Index mit der ONLINE Option angelegt, kann während der Index-Erstellung auf der dazugehörigen Tabelle (schreibend) weitergearbeitet werden Auch bei einem Index Rebuild kann mit der ONLINE Option die Tabelle parallel verändert werden ONLINE Option steht nur in der Enterprise Edition zur Verfügung Index Reorg 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;

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% Pipelined Funktion Skript beim Referenten erhältlich. Möglichkeiten während der Reorganisation eines Index 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 COMPUTE STATISTICS; ALTER INDEX idx REBUILD COMPUTE STATISTICS; Bereits seit 10g werden Statistiken bei einem CREATE INDEX oder ALTER INDEX Befehl automatisch erzeugt!

Nachteile der Index Reorg Index ist "perfekt" ausbalanciert, weist aber keine Lücken für neue Einträge auf Neue Spaltenwerte führen zu einem Index Block Split 50/50 Block Split (die Hälfte der Einträge des "alten" Blocks werden in den "neuen" Block kopiert) 90/10 (bzw. 99/1) Block Split (wenn der höchste Wert im Index überschritten wurde) Index-Tuning durch Spaltensektion Gedrehte Indizes versuchen die Reihenfolge der indizierten Spalten (c1, c2, c3) zu ändern. Statt c1, c2, c3 c3, c2, c1) CREATE INDEX i ON t (c1, c2, c3) COMPRESS 2; CREATE INDEX i ON t (c3, c2, c1) COMPRESS 2; Achten Sie jedoch darauf, dass nur nach bestimmten Spalten gesucht werden kann Ausnahme: Index Skip Scan (hier werden führende Index-Spalten übersprungen) Index Hints (Auswahl) Positiv Hint Negativ Hint Beschreibung INDEX NO_INDEX Index soll (nicht) verwendet werden INDEX_ASC NO_INDEX Index soll aufsteigend verwendet werden INDEX_DESC NO_INDEX Index soll absteigend verwendet werden INDEX_FFS NO_INDEX_FFS Fast Full Scan für Index (nicht) durchführen

INDEX_SS NO_INDEX_SS Index Skip Scan (nicht) durchführen INDEX_SS_ASC NO_INDEX_SS Index Skip Scan aufsteigend (nicht) durchführen INDEX_SS_DESC NO_INDEX_SS Index Skip Scan absteigend (nicht) durchführen INDEX_COMBINE INDEX_JOIN Mehrere Indizes in Kombination verwenden Zwei Indizes miteinander Joinen, Verknüpfungsspalte ist die ROWID PARALLEL_INDEX NO_PARALLEL_INDEX Indexabfrage (nicht) parallel durchführen INDEX-RRS Parallel Index Fast Full Scan (undokumentiert) Kontaktadresse: Marco Patzwahl MuniQSoft GmbH Grünwalder Weg 13 a D-82008 Unterhaching Telefon: +49 (0) 89-67 90 90 40 Fax: +49 (0) 89-67 90 90 50 E-Mail Internet: marco.patzwahl@muniqsoft.de www.muniqsoft.de