DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Standards, Tipps und Grundlagen zum Umgang mit DB2/SQL und anderen SQL -Dialekten DB2-Optimierung und SQL-Performance Ausgabe 6: 2006 (inkl. DB2V7/V8) © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 1 von 127 DB2-Optimierung und SQL-Performance Inhaltsverzeichnis INHALTSVERZEICHNIS 1 Vorwort 8 2 Grundsätzliches zu DB2 und Performance 10 2.1 Optimierungspotentiale bei DB2 10 2.2 Vorgehensweise beim Tuning 11 2.2.1 Anhaltspunkte und Analysedaten für Tuning 2.2.2 Accounting und “statistics records” 11 11 2.3 Grundvoraussetzungen für DB2/UDB Performance 12 2.4 Voraussetzungen für SQL-Performance bei DB2 13 2.5 Möglichkeiten und Maßnahmen zur SQL-Optimierung 15 2.5.1 Systemtechnische Aktivitäten 2.5.2 Anwendungsbezogene Maßnahmen 2.5.3 Die Tuningpotentiale des DB2-Systems 16 16 17 3 SQL - Die „Structured Query Language“ bei DB2 18 3.1 Relationale Sprachelemente und Operationen bei SQL 20 3.1.1 3.1.2 3.1.3 3.1.4 20 21 22 23 3.2 Die relationale Funktion "SELEKTION" Die relationale Funktion "PROJEKTION" Die relationale Funktion "JOIN" Relationale Mengenoperationen-Zusammenfassung Generelle Überlegungen und Voraussetzungen für SQL Performance 24 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.17 3.2.18 3.2.19 3.2.20 3.2.21 „Dynamic SQL“ Datenbankobjekte und ihre Struktur Tabellen und Tablespaces Indexe Primary und Clustering Indexes “Index Only”-Zugriffe auf VARCHAR Spalten Verzögerte Objektdefinitionen Aufwand und Kosten von Indexes Empfehlungen zu Sortierungen SQL-Abfragen mit Subqueries Komplexität von Queries Spalten-Funktionen Formulieren von Prädikaten Die Verwendung von „scalar functions“ Neuordnen der Tabellenfolge in der FROM Klausel „list prefetch“ Uncommitted read“ “row level locks” Freigabe von Locks “lock escalation” Materialized query tables(MQT's)und AQR 3.2.21.1 Empfehlungen für das Design von "materialized query tables" 3.2.21.2 Empfehlungen für das Design von zugehörigen "base tables" 3.2.22 Der DB2-Katalog © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de 24 24 25 26 26 26 26 26 28 29 29 30 30 31 31 31 31 32 32 32 32 33 34 34 Seite 2 von 127 DB2-Optimierung und SQL-Performance Inhaltsverzeichnis 4 SQL-Tuning und Performance bei DB2 35 4.1 Die neuen Limits bei DB2 Version 8 36 4.2 Die DB2 SQL Engine 37 4.3 SQL-Tuning und die Logik von Abfragen 39 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 39 40 42 42 43 44 4.4 “constant propagation” Eliminieren von „totem Code“ Zusammenfassen von Konstanten („constant folding“) “case-insensitive” Suchen „Sargability“ "Join transitive closure" DB2 SQL und Performance 45 4.4.1 Grundsätzliche Empfehlungen zu DB2-SQL 45 4.4.1.1 Suche die kleinste „row“-Menge 46 4.4.1.2 Lies nur die Spalten, die wirklich benötigt werden 46 4.4.1.3 Reduziere die Anzahl der SQL-Statements 49 4.4.1.4 Kodiere Prädikate, die möglichst selektiv sind 53 4.4.1.5 Beachte die Qualität von DB2-SQL Abfragen 54 4.4.1.6 Nutze „stage1“-Prädikate 54 4.4.1.7 Verwende nie generische SQL-Statements 55 4.4.1.8 Vermeide unnötige SORT-Abläufe 55 4.4.1.9 Sortiere nur die erforderlichen Spalten 56 4.4.1.10 Benutze die ON-Klausel für alle JOIN-Prädikate 58 4.4.1.11 Vermeide UNIONs 58 4.4.1.12 Nutze JOINs anstatt „subqueries“ 61 4.4.1.13 Komplemetärmengen bei „outer joins“ 62 4.4.1.14 Kodiere die selektivsten Prädikate zuerst 63 4.4.1.15 Nutze erprobte Methoden zur Existenzprüfung(EXISTS) 64 4.4.1.16 Subqueries sind zu „tunen“ 66 4.4.1.17 Vermeide alles, was nicht unbedingt notwendig ist 67 4.4.2 Modifikation von SQL-Statements 68 4.4.2.1 Häufigste Modifikationen durch das DB2 68 4.4.2.2 Modifikationen über zusätzliche Prädikate („transitive closure“) 68 4.4.2.3 Vereinfachung der JOIN-Verarbeitung 69 4.4.2.4 Beeinflussung der Reihenfolgen bei OUTER-JOINs 69 4.4.2.5 Subquery-Transformation in JOINs 69 4.4.2.6 Auswahl der „outer table“ bei JOINs 70 4.4.2.7 Ausschalten von Indizes 71 4.4.2.8 Beeinflussen der IX-Nutzung 72 4.4.2.9 Beeinflussen von „outer table“ Auswahl und JOIN-Methode 72 4.4.3 Restrukturierung von UNION- durch CASE-Ausdrücke 75 4.4.4 Spezielle Techniken 77 4.4.4.1 CASE in Prädikaten 77 4.4.4.2 CASE in UPDATE – Anweisungen 79 4.4.4.3 CASE zum Vermeiden von Rechen- oder anderen Fehlern 81 4.4.4.4 CASE zum Eliminieren von UNION-Klauseln 82 4.4.4.5 Funktionsequivalente Ausdrücke zur CASE-Klausel 83 4.4.4.6 GROUP BY für „single pass“ 84 4.4.4.7 GROUP BY für beide Seiten 85 4.4.5 ORDER BY und SORT-Vorgänge bei DB2 87 4.4.5.1 ORDER BY und Vermeiden von Sorts (seit V7) 87 4.4.5.2 Nutzung von „Local Storage“ 89 4.4.5.3 Buffer Pool Storage Nutzung 89 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 3 von 127 DB2-Optimierung und SQL-Performance 4.5 4.6 4.7 Inhaltsverzeichnis 4.4.5.4 DASD Nutzung 4.4.5.5 Nutzung von Work Files 4.4.5.6 Berechnen der SORT Pool Größe 4.4.5.7 "Secondary Extents" 4.4.5.8 Weitere Überlegungen: „Sort Assist“ 4.4.5.9 Weitere Überlegungen: „Destructive Reads“ 4.4.5.10 Weitere Überlegungen:” Locks auf Work Files“ 4.4.5.11 Wann wird ein Sort erforderlich? 4.4.5.12 Größe und Anzahl von “Sort Work Files“ 4.4.5.13 Isolieren der DSNDB07 im eigenen Bufferpool 4.4.5.14 Benutzen von “Temporary Tables” 4.4.5.15 Weitere Nutzer der Workfile Database 4.4.5.16 Index-Unterstützung bei SORTs 4.4.5.17 Eliminieren nicht erforderlicher Spalten 4.4.5.18 “Sort Bufferpool Thresholds” 4.4.5.19 Nutzung des Hiperpools für Sortvorgänge 4.4.5.20 Einschalten eines DASD Cache 4.4.5.21 Definition eines 32 KB Bufferpools 4.4.5.22 Überlegungen zum „Data Sharing“ 4.4.6 Einsatz des „cartesian join“ („star-join“) 4.4.6.1 Das „star join“ Schema 4.4.6.2 Wann wird ein “star join” Schema genutzt ? 4.4.6.3 Beispiele: Query mit drei “dimension tables“ 4.4.6.4 Empfehlungen zur Erstellung von IX für "star join queries" 4.4.6.5 Bestimmen der Spaltenreihenfolge in einem Index für ein "star schema" 89 90 91 91 92 92 92 93 93 94 94 94 94 95 95 95 96 96 97 98 98 99 100 102 Mehr Performance für SQL-Operationen in Programmen ab V8 106 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 „scalar full select“ „multiple DISTINCT‘s“ „multi row FETCH“ und „multi row INSERT“ „common table expressions“ Rekursives SQL 106 107 108 110 111 Mehr Performance für Modifikationsoperationen ab V8 113 4.6.1 „multi row INSERT“ 4.6.2 INSERT innerhalb eines SELECT 4.6.3 „multi row FETCH“ und „positioned UPDATE/DELETE" 113 115 116 Do’s und Don’ts bei SQL in Kürze 117 4.7.1 Grundsätzliche Empfehlungen zu SQL 4.7.2 Tipps und Hinweise 4.7.2.1 In Programmen „verbotene“ SQL- Anweisungen 4.7.2.2 SQL - Anweisungen, die keine Indexbenutzung zulassen 4.7.2.3 SQL-Anweisungen, die eine Indexnutzung zulassen, 4.7.2.4 SQL - Anweisungen, die ungünstig formuliert sind 4.7.2.5 SQL – Anweisungen mit ungünstigen JOIN-Formulierungen 4.7.2.6 Vermeiden arithmetischer Ausdrücke in einem Prädikat 4.7.3 DB2 SQL – Nutzungsrichtlinien (Zusammenfassung) 4.7.3.1 Allgemeines 4.7.3.2 ORDER BY und GROUP BY 4.7.3.3 JOIN-Tuning 4.7.3.4 Subquery Tuning 117 118 118 118 119 119 120 121 122 122 123 123 123 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de 103 Seite 4 von 127 DB2-Optimierung und SQL-Performance Inhaltsverzeichnis 5 Die relationalen Komponenten in DB2 124 5.1 Das RDS - Relational Data Systems 124 5.2 DM - Data Manager 124 5.3 BM - Buffer Manager 125 5.4 VSAM (außerhalb von DB2) 125 6 Die Verarbeitung von Prädikaten 126 6.1 Indexable Predicates 128 6.2 Wie wird der Index durchsucht ? 130 6.2.1 "Sargeable und indexable Predicates"(Übersicht) 6.2.2 Sargeable & indexable Predicates / Beispiele 6.2.3 Prädikate auf Sargeable & indexable umformulieren (Beispiele) 131 132 134 DB2 "Access Path"-Auswahl 135 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.3.8 6.3.9 6.3.10 6.3.11 6.3.12 Access-Path-Selection bei Tablespace- / Table-Scan 136 Access-Path-Selection bei "non-matching" Index 137 Access-Path-Selection bei "matching" Index 138 Access-Path-Selection bei "One-Fetch" Index-Scan 139 Access-Path-Selection bei "Index-only" Zugriff 139 DB2 "Access Path"-Selection (Zusammenfassung) 139 DB2 "Access Path"-Auswahl : "List Prefetch" 140 DB2 "Access Path": "Multiple Index Access" / UNION (OR) 141 DB2 "Access Path": "Multiple Index Access" / INTERSECT (AND) 142 DB2 "Access Path"-Auswahl : "Multiple Index Access" / AND + OR 143 DB2 - EXPLAIN für MI-Zugriffe 144 DB2 "Access Path"-Auswahl : JOINs / "nested loop" 145 6.3.12.1 Ablauf des "nested loop"-JOIN 146 6.3.12.2 Performancetipp 146 6.3.13 DB2 "Access Path"-Auswahl : JOINs / "merge scan" 147 6.3.13.1 Vorgehensweise 148 6.3.13.2 Performancetipp 148 6.4 Spezielle Techniken zum Beeinflussen der Pfadauswahl bei DB2 149 6.4.1 Die Informationen über Zugriffspfade 150 6.4.2 Minimieren des "overhead" durch Anfordern von wenigen "rows" 151 6.4.2.1 Was beinhaltet OPTIMIZE FOR n ROWS ? 151 6.4.2.2 OPTIMIZE FOR 1 ROW zum Vermeiden von SORTs? 151 6.4.2.3 Wie wird OPTIMIZE FOR n ROWS in einer CLI Applikation genutzt? 151 6.4.2.4 Wieviele “rows” können mit OPTIMIZE FOR n ROWS gelesen werden? 151 6.4.2.5 Wann ist OPTIMIZE FOR n ROWS effizient? 152 6.4.2.6 Anfordern einer begrenzten Zahl von "rows" 153 6.4.2.7 Abhängigkeit OPTIMIZE FOR n ROWS und FETCH FIRST n ROWS ONLY 154 6.4.3 Nutzung der "cardinality" Klausel 155 6.4.4 Reduzieren der Anzahl "matching columns" 156 6.4.5 Neuanordnen der Tabellenreihenfolge 158 6.4.6 Update der Katalogstatistiken 158 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 5 von 127 DB2-Optimierung und SQL-Performance Inhaltsverzeichnis 6.4.6.1 Modifizieren des Katalogs (Anpassen "correlated columns") 6.4.6.2 Update des Katalogs wegen “join” mit “table functions” 6.4.7 Nutzung von Subsystem Parametern 6.4.7.1 Favorisieren von "matching index" Zugriffen 6.4.7.2 Optimieren von Queries mit IN-List Prädikaten 6.4.7.3 Favorisieren eines indizierten Zugriffs 6.4.7.4 Beispiel einer "Column correlation" 6.4.7.5 Feststellen von "column correlations" 6.4.7.6 Einflüsse von „column correlations“ 6.4.7.7 Was tun bei “column correlations”? 159 159 160 160 160 161 161 162 163 165 7 Analyse der Zugriffspfade und DB2-Optimizer Informationen 166 7.1 Faktoren der Entscheidung für den DB2-Optimizer 167 7.2 Der Optimierungsvorgang und EXPLAIN 7.2.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 168 Prädikate und Prädikatkategorien Die Filter Filterfaktoren(FF) PLAN_TABLE und EXPLAIN Voraussetzungen für effizientes EXPLAIN 168 169 170 173 174 Informationen, die nicht in der PLAN_TABLE stehen 175 7.3.1 7.3.2 7.4 7.4.1 7.4.2 175 176 178 178 179 Die DSN_STATEMNT_TABLE Einflüsse auf die Kostenkategorien Verbesserungen für "stage 2"-Prädikate "view" – Materialisierung "nested table expression" – Materialisierung 8 Behandlung langlaufender Queries/Statements 180 8.1 Explain und PLAN_TABLE prüfen 180 8.2 DSN_STATEMNT_TABLE einbeziehen 180 8.3 SQL-Statement überprüfen 180 8.4 Prüfen der Struktur des Datenmodells 181 8.5 RUNSTATS-Statistik-Spalten des Katalogs überprüfen 181 8.6 Monitor einsetzen und Ergebnisse überprüfen (z.B. DB2PM) 181 8.7 SQL TRACE REPORT überprüfen (z.B. DB2PM) 182 9 Messwerte und Daten für SQL-Performance 183 9.1 Bufferpool-Hit Ratio und Maximal Unreferenced Pool Age (MUPA) 183 9.2 DB2-Tools und die Ermittlung von Performance-Werten 185 9.3 Statistikdaten des Katalogs 187 9.4 Statistikdaten und ihre Auswirkung auf das DB2 Optimizing 188 9.5 Manipulation von Statistikwerten 197 9.6 DB2-Accounting-Zeiten 200 9.7 SQL Query-Typen: "I/O Bound" und "CPU Bound" 202 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 6 von 127 DB2-Optimierung und SQL-Performance 10 Inhaltsverzeichnis SQL-Query und Tuning Empfehlungen (Zusammenfassung) 203 10.1 Richtlinien zur Leistungsoptimierung 203 10.2 Kodieren Sie SQL nur für die erforderlichen Ergebnisse 205 10.3 Wird die erwartete Performance nicht erreicht 205 10.4 Prädikate werden in „stages“ verarbeitet 206 10.5 Weitere Empfehlungen zu SQL-Queries 207 10.6 ORDER BY / GROUP BY 207 10.7 JOIN Tuning – Allgemein 207 10.8 Subquery Tuning 208 11 209 Anhang 11.1 „builtin-functions“ 210 11.2 Abbildungsverzeichnis 220 11.3 Index 223 11.4 Glossar 227 11.5 Literaturhinweise 264 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 7 von 127 DB2-Optimierung und SQL-Performance 1 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Vorwort „Information steht heute und auch in Zukunft im Mittelpunkt wirtschaftlichen Handelns. Information wurde zur treibenden Kraft der Informationsgesellschaft ... „ Das Zitat von John Naisbitt über die Ressource “Information” in seinem Bestseller „Megatrends“ von 1988(!) sagt in Kürze immer noch alles über die Bedeutung der Information in unserer Gesellschaft aus. Information ist ein denkbar abstrakter Stoff, der leichter, effizienter und produktiver verwendet werden kann, wenn er geordnet und seinem sinnvollen Zusammenhang gemäß dargestellt und angeboten wird. Datenbankmanagementsysteme (DBMS) sind die Werkzeuge, mit denen Informationen strukturiert, verwaltet und bedarfsgerecht aufbereitet, wieder geliefert werden können sollen. Über sie werden moderne Informationssysteme erst möglich. DB2/UDB von IBM ist eines dieser Datenbanksysteme, das in einer modernen ITUmgebung in der Lage ist, Informationsarchitekturen und -systeme über und für die gesamte Unternehmenshierarchie umfassend möglich zu machen. Informationsverarbeitung ist dann effizient, wenn die richtigen Informationen zum richtigen Zeitpunkt am richtigen Ort sind. Dazu bedarf es einer sorgfältigen Planung, einer technisch perfekten Implementierung und einer ständigen Kontrolle und Abstimmung. Die Datenbank als Informationsspeicher muss in der Lage sein, die gestellten Anforderungen sicher, konsistent und schnell zu erfüllen: Manche Informationen sind eben nur dann wertvoll, wenn sie hochaktuell sind. Und - jeder Nutzer spezifischer Informationen kann seine eigenen individuellen und subjektiven Ansprüche an diese Ressource “Information” stellen. Dies erfordert seitens der Technik hochperformante und flexible, aber auch stabile und sichere Systeme. DB2/UDB bietet Möglichkeiten, so eingestellt zu werden, dass alle erforderlichen Aktivitäten und Anwendungen auf effizienteste Art und Weise bedient werden könnten. Dazu müssen alle (System-)Parameter optimal gewählt und die Datenstrukturen nach sorgfältiger Analyse in die physische DB2-Umgebung implementiert werden. Dies gilt umso mehr, als mit der Ausweitung der Informationstechnik die Komplexität der Information selbst und die Quantität angebotener Datenmengen ständig zunimmt, andererseits die Informationsqualität weiter verbessert und die verfügbaren Informationen immer effektiver und genauer dargeboten werden sollen. Insbesondere aber gilt es, Applikationen architektonisch so abzubilden und Programme so zu schreiben, dass die Performanceziele erreicht werden und ein Minimum an Kosten entstehen. Denn: Ein Datenbanksystem selbst bringt den Unternehmen noch keinen oder nur geringen Nutzen. Dieser entsteht erst aus der intensiven Nutzung der verfügbaren Information und der daraus resultierenden betriebswirtschaftlichen Wertschöpfung: Je mehr Nutzung, desto mehr Nutzen und umso besser für das Unternehmen. Die Erkenntnis, dass der Unternehmenserfolg, wie bei den bekannten „klassischen“ Produktionsfaktoren - Finanzen, Material, Anlagen und Personal unmittelbar von einer erschöpfenden und werteffizienten Verwertung dieser „fünften Kraft“ – Information - abhängt, führte zur Suche nach neuen Konzepten in einem neuen betriebswirtschaftlichen Umfeld - der Informationswirtschaft. Im Zentrum dieser wirtschaftlichen Aspekte steht die Informationstechnologie - ihre Möglichkeiten, ihre Produkte. Die Erwartungen an die Leistungsfähigkeit eines DBMS sind folglich enorm hoch. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 8 von 127 DB2-Optimierung und SQL-Performance Kapitel 2: Grundsätzliches zu DB2 und Performance In dieser Handbuchserie werden unter DB2 Performance-Gesichtspunkten alle wichtigen Fragen zu und die Möglichkeiten in Hinsicht auf das Produkt DB2 thematisiert. Die Serie besteht aus folgenden Büchern: 01_Die Umgebung von DB2 – Eine Architekturübersicht 02_DB2 und das Relationenmodell von Dr. Codd 03_DB2-Optimierung und SQL-Performance 04_Physisches DB-Design und DB2-Performance 05_DB2 und effiziente Anwendungsentwicklung 06_Administration von DB2 Umgebungen 07_Tunig-Beispiele zu DB2: Erfahrungen aus der Praxis 08_DB2 im Client-Server Umfeld 09_Tools und hilfreiche Produkte zu DB2 Die gesamte Handbuch-Serie stellt sich nicht in Form von „Manuals“ im Sinne von Systemdokumentation dar – diese werden vom Hersteller sowieso angeboten. Vielmehr ist beabsichtigt, DB2 unter Nutzbarkeits- und Performance-Gesichtspunkten möglichst umfassend zu beleuchten. Die Serie ist für Kenner, nicht in erster Linie für Neulinge im Umgang mit DB2, konzipiert. Dieses Handbuch beschäftigt sich mit dem Thema: „DB2 und SQL-Performance“. Es soll als Leitfaden dienen, das SQL Statements ursprünglich, richtig und effizient zu entwickeln, zu testen und zukünftig optimal schreiben und einstellen zu können immer mit dem Ziel, höchstmöglicher Performance in allen direkt betroffenen und umliegenden Betrachtungsfeldern. Viel Spaß beim Lesen und viel Erfolg bei der Nutzung von IBM’s DB2/UDB. Mit freundlichen Grüßen S.K. Consulting Services GmbH Sepp Kraus Für die Mitarbeit an diesem Handbuch bedanken wir uns insbesondere bei den Firmen ARAL AG, Bochum AXA Versicherungen, Köln BMW AG, München Quelle AG, Fürth Itellium GmbH & Co, Fürth IT-Verlag, Sauerlach b. München © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 9 von 127 DB2-Optimierung und SQL-Performance 2 2.1 Kapitel 2: Grundsätzliches zu DB2 und Performance Grundsätzliches zu DB2 und Performance Optimierungspotentiale bei DB2 Die Optimierungspotentiale bei relationalen Datenbanksystemen unterscheiden sich generell – auch zwischen DB2 und Oracle, SQL Server und SYBASE - nur minimal. Sicher ist, dass die höchsten Potentiale, um diese relationalen Datenbanksysteme schneller zu machen im Bereich der Abfragesprache SQL und damit im Umfeld der Anwendungsentwicklung und der Programme zu suchen ist (siehe Grafik unten). Eine weitere Fehlerquelle ist das physische DB-Design, gefolgt von der Einstellung der Systemparameter im DB2 selbst und im Betriebssystem (OS/390, z/OS, AIX, UNIX usw.) Empfehlenswert ist es natürlich im Tuningfall dort zuerst zu suchen, wo das größte Potential zum Lösen der Tuningaufgaben existiert. Man darf dann nur die anderen Bereiche nicht vergessen. In diesem Handbuch werden vorrangig die Problematiken der Sprache SQL und der damit zusammenhängenden Performance“ behandelt. Die Problematik des physischen Designs in DB2 findet man im Band "Physisches DB Design und DB2 Performance" aus dieser Reihe „Tuning und Performance für DB2-Umgebungen“. 2 = DB2 System (10%) 3 = phys. DBDB-Design (20%) 4 = Anwendung (60%) 1 2 3 4 1 = OS System (10%) Bild-01: Tuningpotentiale bei DB2 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 10 von 127 DB2-Optimierung und SQL-Performance 2.2 Kapitel 2: Grundsätzliches zu DB2 und Performance Vorgehensweise beim Tuning Grundsätzlich ist Tuning ein iterativer Vorgang: Schritt_1: Analyse der Details Schritt_2: Erarbeiten einer Lösung Schritt_3: Test der Lösung Schritt_4: Vergleich der Ergebnisse Wiederholung des Prozesses bis zum besten Resultat Bild-02: Vorgehensweise beim Tuning In allen Schritten ist jede mögliche Maßnahme zum Erreichen des Tuning-Ziels erlaubt. 2.2.1 Anhaltspunkte und Analysedaten für Tuning Anhaltspunkte für Tuning bieten bei DB2 für OS/390 oder z/OS folgende Messdaten 2.2.2 1. Elapsed Time Analysis und Tuning 2. CPU Time Tuning: Aufwände für Select, Insert, Update, Delete, Dynamic Bind, DB2 Traces, Distributed/ Stored Procedure, DB2 Data Compression 3. Buffer Pool, Locking, EDM Pool, Work File, LOB, DBM1 Virtual Storage Accounting und “statistics records” Alle “accounting” und Statistikdaten sind bei DB2 relativ einfach und kostengünstig zu erhalten. Sie sind vor allem nützlich für ein kontinuierliches Monitoring der Performance und das daraus erforderliche Tuning. Für eine erste Analyse genügen meistens: Der „Accounting report” (nicht “trace”) pro “connection type” oder Plan und Der „Accounting Report” (nicht “trace”) für dieselbe Zeitspanne Diese Fakten sollten die ersten sein, die betrachtet werden, wenn ein DB2 Performance Problem auftaucht. Beispiel: DB2PM Command Eingabe zum Erhalt der entsprechenden passenden Daten: DB2PM STATISTICS REPORT LAYOUT (LONG), und DB2PM ACCOUNTING REPORT LAYOUT (LONG) ORDER (CONNTYPE) EXCLUDE (PACKAGE(*)) zur Gruppierung über “thread connection type”, wie TSO, CICS, DB2CALL, IMS, APPL- DIR, SYST- DIR, usw., oder DB2PM ACCOUNTING REPORT LAYOUT (LONG) ORDER (PLANNAME) und INCLUDE (DB2ID (xxxx)) FROM (03/ 11/ 00,10: 00: 00.00) TO (.......) Weitere Anhaltspunkte zur Analyse der DB2-Faktoren unter Pkt 9.6 ff. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 11 von 127 DB2-Optimierung und SQL-Performance 2.3 Kapitel 2: Grundsätzliches zu DB2 und Performance Grundvoraussetzungen für DB2/UDB Performance 1. Stellen Sie sicher, dass genügend Plattenplatz vorhanden ist. (6-10 Laufwerke pro CPU ist für den Anfang genug). Jeder "table space's container" sollte alle verfügbaren Platten erreichen können. Einige "table spaces", wie zum Beispiel SYSCATSPACE und alle mit einer geringen Anzahl von Tabellen sollten nicht über alle möglichen "Disks" gestreut werden, wogegen die TS mit einer großen Userzahl oder auch "temporary tables" möglichst über den gesamten "diskpool" gestreut sein sollten. 2. Bufferpools sollten einen Nutzungsgrad des verfügbaren Speichers von ca. 75% (bei OLTP Anwendungen) oder 50% (bei OLAP Anwendungen) ausweisen. 3. RUNSTATS sollte auf allen Tabellen, inklusive der Systemtabellen (Katalog) durchgeführt sein. Gegebenenfalls sollte man den "Design Advisor" nutzen, um eine Empfehlung und ein "review" für die Indizes bezüglich ihrer SQL" workloads" zu erhalten. 4. Man kann auch den "Configuration Advisor" nutzen, um den "Database Manager" und die Datenbank für die entsprechenden Applikationen zu konfigurieren. 5. Logging sollte auf separaten "high-speed Disks" erfolgen. Diese sollten über den DB2 Konfigurationsparameter NEWLOGPATH identifiziert werden. 6. "Concurrency" kann durch häufige "commits" verbessert werden (SQL Statement Tuning). Der Parameter SORTHEAP sollte höher eingestellt werden, um so "sort overflows" zu vermeiden (DBM und DB Konfiguration). 7. Der Tablespace Typ für den "System catalog table space" sollte SMS sein und "temporary table spaces" und "DMS raw (device)" oder "File" sollte für den Rest definiert sein. Empfohlen wird die Ausführung der Prozedur "db2empfa", um die "multipage file allocation" für die SMS Tablespaces einzuschalten. Dies erlaubt den SMS Tablespaces in einem Zug per "extent" zu wachsen (anstatt "page"-weise). Das kann massive INSERT-Operationen und Sortvorgänge, die die Platten nutzen, erheblich beschleunigen. 8. Man nutze "parameter markers" für sich wiederholende SQLStatements (SQL Statement Tuning). © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 12 von 127 DB2-Optimierung und SQL-Performance 2.4 Kapitel 2: Grundsätzliches zu DB2 und Performance Voraussetzungen für SQL-Performance bei DB2 Es ist bekannt, dass sich Tuning- und Performance-Maßnahmen auch bei relationalen Systemen bis auf die Applikationsentwicklung auswirken. Es gilt auch hier, dass die ineffiziente Nutzung von Systemressourcen durch Anwendungsprogramme über systemtechnische Einstellungen nicht korrigiert werden kann. Entwickler müssen deshalb: Verständnis für die Interna der DB2-Umgebung besitzen ein tiefes Wissen über DB2-Tuning-Ansätze und OptimizerVerhalten haben Das Fundament für gute Performance kann nur über entsprechende Maßnahmen beim System-Design in Daten- und Funktionsentwurf erreicht werden Weitere den Leistungsdurchsatz beeinflussende Faktoren sind: 1. Bestimmte Benutzergruppen Die grob einzuteilenden Benutzergruppen, die diese Frage aus der Sicht des Anwenderverhaltens problematisch werden lassen, sind End-User mit allen Erwartungen/Anforderungen • • • • in allen denkbaren und nicht planbaren Datenkonstellationen mit komfortablen Oberflächen mit guten, unverzüglichen Antwortzeiten mit permanenter Verfügbarkeit Anwendungsentwickler mit ihrer Qualifikation • • • • mit dem Wissen über Vorgehensmethoden und -techniken mit dem Verständnis komplexer Zusammenhänge mit Verständnis für interne, systemtechnische Zusammenhänge und Konsequenzen unter dem Aspekt des Einsatzes und der Handhabung von Tools Administratoren mit ihrem Qualitätsanspruch • • • Planung und Kontrolle optimierter Ressource-Nutzung Sicherstellen aller möglichen und notwendigen „security“Aspekte Nutzung effizienter und sicherer Administrationswerkzeuge © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 13 von 127 DB2-Optimierung und SQL-Performance 2. Kapitel 2: Grundsätzliches zu DB2 und Performance Methodeneinsatz In den aus der Praxis entlehnten Erfahrungen mit Performanceproblemen weisen die meisten auf unsystematisches Vorgehen in der Anwendungsentwicklung hin (siehe auch Grafik im Kapitel „DB2 Anwendungsentwicklung“ / Pkt. I: Übersicht). Sinnvollerweise sollte beim Vorgehen in der AE (= Anwendungsentwicklung ) auf folgende Faktoren besonderes Augenmerk gelegt werden: Einsatz einer fundierten Vorgehens- und Systementwicklungsmethodik und deren Kontrolle Festlegung objektivierbarer und sinnvoller PerformanceZielsetzungen Permanente Berücksichtigung aktueller PerformanceErkenntnisse 3. Technologie-Einsatz Hoher Komfort verlangt nach hohem Ressourceneinsatz. Dennoch sollen die Ressourcen angemessen sein. „Übergroße Schuhe hindern einen am Laufen ebenso wie zu kleine....“ Dabei ist es entscheidend, dass auf keiner der unterschiedlichen Ressourcen- und Technologieebenen Engpässe auftreten: angemessene Hardware abgestimmtes Betriebssystem und systemnahe Software moderater Einsatz von Standard-Software-Systemen Unterstützung von Individualanwendungen Nutzung von Performance-Tools © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 14 von 127 DB2-Optimierung und SQL-Performance 2.5 Kapitel 2: Grundsätzliches zu DB2 und Performance Möglichkeiten und Maßnahmen zur SQL-Optimierung Wie in jedem Datenbanksystem sind auch bei DB2 die Tuningmöglichkeiten auf einige, aber komplexe und sinnvolle Maßnahmen beschränkt. Die Tuningmaßnahmen in den einzelnen Bereichen gehorchen jedoch den allgemeinen Gesetzen des Systemtunings und diese sind: 1. Performance entsteht nicht von selbst! 2. Performance ist niemals statisch! 3. Performance ist zu definieren und damit PLANBAR 4. "benchmarks" sind meist SUBJEKTIV und damit im Einzelfall NICHT aussagefähig !!!!! 5. Performance wird erreicht durch das Zusammenwirken mehrerer (annähernd) GLEICHWERTIGER Faktoren: a) realistisches, "sauberes" Informationsmodell b) optimale Umsetzung in die physische Umgebung c) systematische Anwendungsentwicklung d) effiziente Anwendungsprogramme e) optimale Einstellung der DBMS-Parameter f) entsprechende Änderung der OS-Parameter g) ständige Überwachung der Produktionsumgebung - Datenadministration - Datenbankadministration - "Monitoring" h) entsprechender Hardware-Einsatz Die Tuning-Möglichkeiten bei DB2 lassen sich dann grob unterteilen in: Systemtechnische Aktivitäten Anwendungsbezogene Maßnahmen Die Tuningpotentiale des DB2-Systems © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 15 von 127 DB2-Optimierung und SQL-Performance 2.5.1 Kapitel 2: Grundsätzliches zu DB2 und Performance Systemtechnische Aktivitäten Zu den systemtechnischen Maßnahmen, die in den direkten Zuständigkeitsbereich der Datenbankadministratoren (DBAs) beispielsweise für DB2/MVS fallen, gehören: • Optimierung der Generierungsparameter für MVS, CICS, IMS-DB und TSO. • Autorisierungskonzept. • Connection- und Thread-Nutzung • Optimierung der Generierungsparameter für DB2, wie z.B.: - • Festlegung der Optionen für physische DB2-Objekte, wie z.B.: - 2.5.2 Bufferpool-Größe und -Nutzung EDM-PooI-Größe Lock-Definitionen (IRLM) LOG-Definifionen. Storagegroup / User defined VSAM-Datasets DB2-Databases Tablespaces Indizes Packages, Collections und Pläne. • Re- bzw. Umorganisation der physischen Datenspeicherung. • Anlegen, Ändern oder Löschen von Indizes. • Beeinflussung des DB2-Zugriffspfades durch Manipulation von KatalogStatistik-Spalten. • Permanente Überwachung des Systemverhaltens, Starten von Utilities, wie z.B. RUNSTATS, • Durchführung gezielter REBIND-Maßnahmen. Anwendungsbezogene Maßnahmen Unter anwendungsbezogenen Maßnahmen versteht man: • logische und physische Datenmodellierung mit Festlegung der Benutzer-DB2-Objekte (auch Denormalisierung, falls erforderlich). • Einsatzentscheidungen für: Tabellen, Views, Synonyme und Aliase. • Veränderungen der Datenablage mit Auswirkung auf die logische Ebene (z.B. Aufteilen langer Zeilen, Kompression, Änderung von Datentypen). • Festlegung und Test von SQL-Statements (z.B. durch EXPLAIN nach Ausführung von RUNSTATS). • Umschreiben von Queries (Abfragen und Manipulationen) in effizienterer Form. • Festlegung von "constraints", "triggers", UDF’s und Prozeduren © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 16 von 127 DB2-Optimierung und SQL-Performance 2.5.3 Kapitel 2: Grundsätzliches zu DB2 und Performance Die Tuningpotentiale des DB2-Systems Die Tuningpotentiale des DB2-Systems selbst liegen vor allem in folgenden Bereichen: • MVS-Prioritäten-Steuerung • Adressraum-Nutzung • Paging/Swapping • Interne Ressource-Nutzung • Generierungsparameter(ZPARMS) • Connection/Thread-Nutzung • Anzahl parallele Threads • Autorisierungs-Konzepte • MVS- und DB2-Systemparameter • Cross-Memory- und System-Kommunikation • Bufferpool-Größe und Nutzung • LOG-Management • LOCK-Management • Interne Ressource-Nutzung: - Anzahl intern zu haltender Zeilen (Materialisierungen) • Definition der Daten-Zugriffspfade: - Einfache Zugriffspfade Page Set Scan, Index-Nutzung Komplexe Zugriffspfade Join, Subqueries • Filtermöglichkeiten und Aufwand bei der Bearbeitung vorgegebener SQL-Prädikate. Andere Andere • Anzahl zu übertragender Pages = Cl’s • VSAM-Optionen • DB2-DDL-Optionen • Page-Nutzung • Freespace-Zuordnung • Daten-Zusammenlegung • Daten-Verteilung(DDF) • Speicherhierarchien • Index-Definition und –Nutzung Trägersysteme Trägersysteme SystemSystemServices Services DatabaseDatabaseServices Services IRLM IRLM-Services Services DDFDDFServices Services VSAM Bild-03: Die DB2-Services im Überblick © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 17 von 127 DB2-Optimierung und SQL-Performance 3 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 SQL - Die „Structured Query Language“ bei DB2 SQL besteht aus folgenden Kategorien, die sich wiederum in ihren Sprachelementen unterscheiden: DDL DML DCL Data Definition Language Data Manipulation Language Data Control Language DDL DML DCL CREATE DROP ALTER DELETE LABEL COMMENT SELECT INSERT UPDATE GRANT REVOKE Bild-04: Übersicht über die SQL-Sprachelemente Während DDL und DCL in Richtung des "environment management" von DB2 zielen, kann die DML als das User-Interface der Sprache SQL bezeichnet werden. Dabei ist nicht die Menge der Sprachelemente entscheidend, sondern deren Kombinierbarkeit. Sie macht die Mächtigkeit von SQL aus. DB2 deckt damit die DML-Anforderungen im Relationenmodell ab: Es gibt keine Auswirkung der physischen Speicherungsgegebenheiten auf - die Formulierung von SQL, z. B. TS-Formen, Indizes usf. SQL als nicht-prozedurale Sprache die Qualität von DB2-SQL: alle Sprachelemente sind Mengenoperationen Und: SQL enthält Sprachkonstrukte für Projektion, Selektion, Join. SQL bietet eine Vielzahl "eingebauter Funktionen" ("builtin functions" und "scalar functions" ) für bool´sche Operationen, für spezielle Prädikate und "date / time" - Arithmetik. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 18 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Fast alle SQL-DML-Befehle können in Form von "views" abgelegt werden. Die wichtigsten Sprachelemente der SQL-DML finden Sie in der folgenden Übersicht. Lesen Ändern SELECT INSERT UPDATE DELETE eingebaute Funktionen SUM MAX, MIN, AVG DISTINCT COUNT GROUP BY HAVING GROUP BY HAVING spezielle Aussagen Sortieren ORDER BY Bool´sche Operatoren AND OR NOT Sperren LOCK Arithmetische Operatoren Gruppieren Vergleichsoperatoren = , >=, <= ^=, ==, <> >,< LIKE UNION IN, ANY , ALL BETWEEN EXISTS + / ( Spez. Arithmetik , , ) * YEAR, MONTH, DAY, DAYS HOUR, MINUTE, MICROSECOND, CURRENT DATE, TIME, DAY WEEK, "Scalar Functions" SECOND, LENGTH, VALUE, SUBSTR, || CHAR, INT, HEX, DEC, FLOAT, DIGITS TIMESTAMP NULLIF, CASE COALESCE Weitere Funktionen(Beispiele): CLOB, BLOB ABS, ROUND, ACOS, ASIN, "Table Functions" ATAN, COS, MQREADALL, LOWER, UPPER MQRECEIVEALL LTRIM, RTRIM, RAND, REPEAT SIGN, STRIP, TAN, TRUNC.... Bild-05: Grobe Übersicht über die SQL-Funktionen Eine Liste aller derzeit in DB2 implementierten “builtin-functions“ mit Beispielen findet man im Anhang unter Pkt.11.1 ff. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 19 von 127 DB2-Optimierung und SQL-Performance 3.1 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Relationale Sprachelemente und Operationen bei SQL SQL nutzt algebraische Mengenfunktionen zur Qualifikation der Daten. Die Grundelemente sind dabei: 3.1.1 PROJEKTION Auswahl bestimmter Spalten SELEKTION Auswahl bestimmter Zeilen aufgrund von Dateninhalten - auch anhand verknüpfter Suchkriterien JOIN Zusammenführen von Daten aus mehreren Tabellen Die relationale Funktion "SELEKTION" Die Funktion "SELEKTION" meint in der relationalen Algebra die Auswahl bestimmter Zeilen, z. B. aus TAB A A B C D E a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4 d1 d2 d3 d4 e1 e2 e3 e4 A B C D E a2 a4 b2 b4 c2 c4 d2 d4 e2 e4 ergibt In SQL lautet die Formulierung: SELECT * FROM TABA WHERE A = 'a2' OR A = 'a4' Bild-06: Die Selektion im RDB-Modell © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 20 von 127 DB2-Optimierung und SQL-Performance 3.1.2 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Die relationale Funktion "PROJEKTION" Die "PROJEKTION" im Sinne der relationalen Algebra bedeutet die Auswahl bestimmter Spalten aus einer Relation, z.B. Spalte A, C, D A B C D E a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4 d1 d2 d3 d4 e1 e2 e3 e4 A C D a1 a2 a3 a4 c1 c2 c3 c4 d1 d2 d3 d4 ergibt a) häufig erfolgt auch eine Mischung aus “Selektion” und „Projektion“ ergibt b) A C D a2 a4 c2 c4 d2 d4 In SQL lautet die Formulierung: a) SELECT FROM A, C, D TABA b) SELECT FROM WHERE OR A, C, D TABA A = 'a2' A = 'a4' Bild-07: Die Projektion im RDB-Modell © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 21 von 127 DB2-Optimierung und SQL-Performance 3.1.3 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Die relationale Funktion "JOIN" Die Funktion JOIN basiert auf dem Verbinden von Tabellen = Bilden des “kartesischen Produkts”. Diese Mengenfunktion ist mathematisch korrekt, aber informationstechnisch von minderem Wert. Deshalb bildet man bei SQL-JOINs nicht das kartesische Produkt, sondern vielmehr eine Intersektionsmenge (= Durchschnittsmenge). Dazu muss der Anwender wissen, über welche Attribute (Spalten) die Verbindung zur jeweils anderen Tabelle hergestellt werden kann. Zusammengesetzte Schlüssel müssen dazu vollständig qualifiziert werden. Im Beispiel wird über A verknüpft. TABA A B C D E a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4 d1 d2 d3 d4 e1 e2 e3 e4 nicht im Ergebnis (out of join) TABB ergibt als karthesisches Produkt die Permutation aus beiden Tabellen - als JOIN Menge aber folgendes Resultat: F G H a1 a2 a4 g1 g2 g3 h1 h2 h3 A B C D E F G H a1 a2 a4 b1 b2 b4 c1 c2 c4 d1 d2 d4 e1 e2 e4 a1 a2 a4 g1 g2 g3 h1 h2 h3 In SQL lautet die JOIN-Formulierung: SELECT FROM , WHERE * TABA TABB TABA.A = TABB.F Bild-08: Der Join im RDB-Modell © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 22 von 127 DB2-Optimierung und SQL-Performance 3.1.4 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Relationale Mengenoperationen-Zusammenfassung Alle Mengenoperationen des Realtionenmodells sind in genau diesem beschrieben und diese sind als die folgenden relationalen Operationen in SQL formulierbar. Untermenge ( SELECTION, PROJECTION ) Schnittmenge ( (INNER) JOIN, INTERSECT ) Vereinigungsmenge ( UNION, FULL OUTER JOIN ) Ausschlussmenge ( ... NOT IN ... NOT EXISTS.. , LEFT oder RIGHT OUTER JOIN) Bild-09: Funktionen im RDB-Modell (Zusammenfassung) © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 23 von 127 DB2-Optimierung und SQL-Performance 3.2 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Generelle Überlegungen und Voraussetzungen für SQL Performance In diesem Kapitel werden zunächst einige Basisfragen zum Thema "Do's and Don'ts bei DB2 SQL" behandelt und damit soll mit einigen Gerüchten von vorneherein aufgeräumt werden. 3.2.1 „Dynamic SQL“ Dynamisches SQL ist zunächst kein Problem – aber die mehrfache Nutzung desselben SQL-Statements kann zu unnötigen Verzögerungen im Vergleich zu statischen SQL-Anweisungen führen. Deshalb sollten dynamische SQL-Anweisungen in einem speziellen Cache abgelegt werden. In diesem Fall prüft das DB2 erst den Cache-Inhalt, wenn ein PREPARE öfter dasselbe SQL-Statement benötigen sollte. Wird das SQL-Statement im Cache gefunden, kann es wieder verwendet werden und das System erspart sich einen „overhead“ von bis zu 80% CPU Verbrauch für zusätzliche Prepare's. Benutzt man aber das so genannte „dynamic SQL-cacheing“ dann muss der EDMPool ebenfalls entsprechend angepasst werden. EDM-Pool Statistiken helfen das „cacheing“ zu tunen (siehe IFCID-Informationen). Wichtig ist es zudem, dass die SQL Queries dann als "parameter marked" Queries an das DB2 gegeben werden. Das bedeutet nichts anderes, als dass keine "hostvariablen direkt in die Query-Formulierungen eingebettet werden sollen, sondern alle Stellen, an denen eine Hostvariable stehen kann mit einem "?" vorbelegt werden. Beispiel: SELECT FROM WHERE AND ...... tab t t. c1 > ? t.c6 BETWEEN ? AND ? Erst der Aufruf der Query versorgt die "Parametermarker" mit Variablenwerten: EXECUTE sql_statement USING :hvc1, :hvc61, :hvc62; 3.2.2 Datenbankobjekte und ihre Struktur Oft trifft man gerade in Standardsoftware-Umgebungen schwierige und riesige Anzahlen von DB-Objekten an. DWH- und/oder SAP-Anwendungen erzeugen für sich oft mehr als 18.000 Objekte. In der Version DB2V7 installiert beispielsweise Peoplesoft mit seiner Anwendung alleine 5 eigene DB2-Datenbanken(!). Nun stellt in DB2 eine Datenbank nicht ein physisches Objekt dar, sondern eine "DB2 Database" bedeutet vielmehr eine Unterteilung der gesamten DB2-Objekte in kleinere überschaubare Mengen von Objekten. Empfehlenswert wären nicht mehr als 20 Tablespaces pro "Database". Der Grund hierfür ist die Größe des DBD (Database Descriptor). DBD-Sperren erfolgen bei DB2 auf Datenbank-Ebene. Der DBD ist es auch, der, wann immer Änderungen erfolgen, auf die Log-Datei geschrieben wird. Der DBD muss im Speicher resident sein und im EDM-Pool in einem zusammenhängenden Speicherabschnitt liegen. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 24 von 127 DB2-Optimierung und SQL-Performance 3.2.3 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Tabellen und Tablespaces Bei einer großen Menge von Tabellen, so ab ca. 1000 Tabellen, sollten die Daten in Gruppen eingeteilt werden. I/O Strategien und die Verwaltbarkeit der DBUmgebung bestimmen das physische Design mit. Obwohl “multiple table” Tablespaces einfach zu implementieren sind, sind doch einige Punkte bezüglich Größe und physischer Strukturierung zu beachten und empfehlenswert: Anzahl pages Tablespace Typ n > 10.000 Partitionieren n > 1.000 eine einzelne “table” pro segmented TS reicht 128 < n < 1.000 mehr als eine Tabelle in einem segmented TS n < 128 mehr als eine Tabelle in einem segmented TS Bild-10: Übersicht über Strukturierungsempfehlungen zum TS Aber: 100 Tabellen für einen “shared segmented TS” sollten das Maximum sein. Extrem wichtig in diesem Zusammenhang ist auch die Größe der TB-Segmente. Anzahl pages SEGSIZE n <= 28 4 bis 28, ähnlich der Anzahl pages 28 < n < 128 32 n >= 128 64 Bild-11: Übersicht über Segmentierungsempfehlungen zum TS Alle gruppierten Tabellen sollten sorgfältig dahingehend untersucht werden, ob sie sich in ihren fundamentalen Charakteristiken ähneln. Manche Arbeits- und temporäre Tabellen (gerade von Softwareherstellern wie z. B. Peoplesoft, SAP usw.) haben sehr unterschiedliche Eigenschaften. Diese können sein: • • • • Daten für die Clients "Codetabellen" Referenzen und “lookup tables” Die Gesamtgröße eines STS sollte immer kleiner 1.000 pages sein (Größere TS sind als PTS zu definieren), um unnötige "prefetch"-Aktivitäten zu vermeiden. Eine Methode hier gegenzusteuern ist sicherzustellen, dass der VPSEQT Parameter auf 0 gesetzt ist und somit diese "prefetch"-Aktivitäten weitgehend ausgeschaltet sind. Zusätzlich sollte die “queuing” Methode auf FIFO gesetzt werden (ab DB2V6), um den Overhead für das “latch”-Management zu vermeiden. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 25 von 127 DB2-Optimierung und SQL-Performance 3.2.4 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Indexe Index-Tuning ist eine Aufgabe, die in den DB2-Installationen dringend zu empfehlen ist. Beispielsweise umfassen viele Indexe nicht die erforderlichen Spalten, um die Wahl eines besten Pfades zuzulassen: Einige Indizes enthalten die Spalten in der falschen Spaltenreihenfolge oder in der falschen Sortierreichenfolge. Gerade für JOINOperationen sind aber gute und richtige Indexe unerlässlich. 3.2.5 Primary und Clustering Indexes Einmal gesetzte Primary Indexes sollten niemals verändert werden (auch nicht bei SAP oder Peoplesoft usw.). Änderungen am PI gefährden nicht nur die Eindeutigkeit von Daten, sondern können auch RI-Bedingungen betreffen. Ebenso sollte der “clustering Index” sorgfältig ausgewählt werden. Nicht immer ist es geschickt den PK auch als “clustering Index” einzusetzen. 3.2.6 “Index Only”-Zugriffe auf VARCHAR Spalten Wegen der vermehrten Nutzung von VARCHAR-Spalten im Index, wurde nach der Version 5 ein „Feature“ für „index only“-Zugriffe auf solche Felder implementiert. Dies ist nur möglich, da die Längeninformation dieser Spalten nun in den Index mitaufgenommen wird. Somit kann auch auf indizierte VARCHAR-Felder zugegriffen werden, ohne dazu die Datenpage lesen zu müssen. Dabei wird abhängig von der Länge der eingetragenen Werte die maximale Länge mit Leerzeichen aufgefüllt. Gesteuert wird dies über den neuen DSNZPARM RETVLCFK=YES. Dazu müssen bei der Migration auf die neuen Versionen 6 oder 7 die Anwendungsprogramme neu mit BIND behandelt werden. In der DB2 Version 8 gibt es zum Thema VARCHAR- und Indexverarbeitung weitere Verbesserungen ("padding"). 3.2.7 Verzögerte Objektdefinitionen Zusätzlich gibt es seit der DB2 Version 6 ein neues „Feature“, das es zulässt, TS und Indizes im Nachhinein zu definieren(DEFER). Im Gegensatz zu früher, müssen nun nicht mehr alle TS und Indexes zum Zeitpunkt der Installation eines Systems (SAP, Peoplesoft...) definiert sein. Dies war früher unabdingbar, auch wenn diese Indizes noch nicht genutzt wurden. Dies soll Installationsvorgänge beschleunigen und die DBA einfacher machen. 3.2.8 Aufwand und Kosten von Indexes Bevor man mit dem Anlegen von Indexes beginnt, sollte man sich Gedanken über den Aufwand zur Pflege dieser Indexes machen und folgende Themen überlegen: Indexes benötigen Speicherplatz - große Indexes viel Speicherplatz. Jeder Index benötigt einen eigenen Indexspace und darunter liegende VSAM Datasets. Es existiert eine Einschränkungen in der Anzahl der offenen Datasets im MVS Betriebssystem (1000 Address Spaces (=default)). Ein Index muss bei jeder Datenänderungen mitgepflegt werden, um die Änderungen in seinen Basistabellen zu reflektieren. Wenn eine © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 26 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 UPDATE SQL-Anweisung eine Spalte verändert und die Spalte Bestandteil eines Index ist, muss der Index ebenfalls verändert werden. Die Gesamtzeit für die Pflege steigt somit entsprechend. Indexes müssen während des Ladens einer Table erstellt werden das kostet Zeit. Sie müssen und können aus ihrer Basis-Tabelle wiederhergestellt werden, wenn der Tablespace wiederhergestellt werden muss, dies verbraucht zusätzlich Zeit. Indexes können seit DB2 V7/V8 mit der Funktion REBUILD jederzeit aus den Daten der zugehörigen Tabelle wiederhergestellt werden nachdem diese Funktion dem Utility REORG beigeordnet ist, ist es mehr als hilfreich, dass dieser im „online“-Modus laufen kann, d.h. der laufende Betrieb von DB2 wird während der REORG-Zeit kaum behindert. Empfehlung: Das Design der Indexe sollte Bestandteil des Database Design sein und nicht vernachlässigt werden. Treten bei SQL-Anweisungen Performance-Probleme auf, stellt man sich zunächst folgende Fragen: 1. 2. 3. Würde das Hinzufügen einer Spalte zu einem Index einer Anweisung erlauben Index-Only-Zugriffe zu nutzen ? Wird ein neuer Index benötigt ? Ist der (bisherige) Index-Aufbau korrekt ? © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 27 von 127 DB2-Optimierung und SQL-Performance 3.2.9 Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 Empfehlungen zu Sortierungen Häufig kann man Sortierungen vermeiden, wenn Index Keys in der Reihenfolge vorliegen, die in ORDER BY, GROUP BY, einer Join-Operation, oder bei einem DISTINCT in einer Column-Funktion benötigt werden. In anderen Fällen, beispielsweise bei Einsatz des List Sequential Prefetch stehen im Index keine sinnvollen Sortierungen zur Verfügung und die selektierten Daten müssen zwangsläufig sortiert werden. Sollte es zwingend erforderlich sein, Sortierungen zu verhindern, so sollte man die Anlage eines passenden Index für die erforderlichen Spalten erwägen und gegebenenfalls die OPTIMIZE FOR n ROW- Anweisung einsetzen (siehe auch Pkt. 6.4.2 ff). Beispiel: SELECT FROM WHERE ORDER BY C1, C2, C3 T1 C1 > 1 C1 OPTIMIZE FOR 1 ROW; Ein aufsteigender Index auf der Spalte C1 kann eine Sortierung vermeiden helfen. Ein Index auf C1 + C2 + C3 erfüllt den gleichen Zweck, ermöglicht aber gleichzeitig einen Index-Only-Zugriff. Man beachte in diesem Zusammenhang aber auch die Hinweise im Abschnitt "Aufwand und Kosten von Indexes", bevor mit neuen Indizes versucht wird, SortOperationen zu vermeiden: Nicht alle Sorts bedeuten eine Behinderung. Ist beispielsweise ein Index nicht effizient genug und werden sehr viele Rows qualifiziert, kann der Optimizer einen anderen Zugriffspfad wählen und stattdessen die Daten ohne Indexzugriff selektieren, anschließend sortieren, und damit u. U. erheblich kostengünstiger arbeiten. Faktoren, die man beachten muss, weil sie die Sort-Performance beeinflussen und Techniken, die Sorts verbessern können, sind: die eingesetzten Prädikate sollten die Daten liefern, die man benötigt: Jede Einschränkung eines Auswahlergebnisses, die Reduzierung des Result Sets, usw. reduziert auch den Sort-Aufwand. wenn Sorts durchgeführt werden, hängt die Row-Länge von der Anzahl der selektierten Ergebnisspalten ab. Die Reduktion der Spalten erhöht die Performance eines Sortvorgangs, wobei vor allem der Umfang der Daten und des Workspaces eine Rolle spielen. Generelle Vorschläge zur Reduzierung der Sort-Row-Länge: 1. 2. 3. Wenn VARCHAR-Spalten nicht benötigt werden, dann verzichte man auf sie. VARCHARs im Index werden mit Blanks auf ihre maximale Länge aufgefüllt (gilt seit DB2 V8 nicht mehr – IX können nun „gepadded“ sein, d.h. die Blanks werden nicht im IX gespeichert). Minimieren der Anzahl von Sort Key Columns, Minimieren der Anzahl der Sort Data columns. Workfiles verfügen über ein vielfältiges Einsatzspektrum und haben eine Wechselwirkung zur Sort-Performance. Es gilt über Global Temporary Tables und Materialized Views nachzudenken. Der Systemadministrator © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 28 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 sollte ausreichend physischen Platz bereitstellen und diese Workspaces in einen eigenen Bufferpool legen. Die Isolierung von anderen Objekten vereinfacht das Monitoring und Tuning der Sort-Performance. Anwendungen die Global Temporary Tables (GT‘J) nutzen, belegen Workfile-Space bei einem COMMIT oder ROLLBACK. Wenn Sorts und GTTNutzung gleichzeitig erfolgen, dann benötigt man sehr wahrscheinlich mehr Work-Space. Der Systemadministrator sollte die Bufferpool-Größe für Workfile Buffers erhöhen, wenn die Prefetch Rate 4 Pages oder weniger beträgt. Bei der Nutzung von STOGROUP‘s sollte nur jeweils ein Volume je Storage Group genutzt werden. Zusätzliche Volumes werden erst genutzt, wenn das erste Volume vollständig belegt wurde. Nie mehr als ein physisches Workfile Dataset je DASD Volume anlegen. Die Größe des Sort Bufferpool beeinflusst die Sort-Performance. Je größer der Buffer, desto größer die Effizienz von Sorts. Die Planung der Konfiguration sollte so erfolgen, dass minimale I/O Contention auf den I/O Paths zu den physischen Workfiles sicherzustellen. Eine Verteilung der Workfiles auf unterschiedliche Disk Paths hilft meist. Sind Statistiken nicht aktuell, sollte man diese mit dem RUNSTATS Utility auf den aktuellen Stand bringen. 3.2.10 SQL-Abfragen mit Subqueries Nutzen Sie Input (Host) Variablen in Prädikaten Ihrer Static SQL Query? Variable wie Parameter-Marker erlauben keine Auskunft über mögliche Werte zur BIND- und Ausführungszeit. DB2 nutzt deshalb den sog. Filterfaktor um den besten Zugriffspfad für ein SQL-Statement zu bestimmen. Wenn sich dieser Zugriffspfad als ineffizient herausstellen sollte, könnte man eine erneute Überprüfung (REOPT) für langlaufende Queries (>10 secs Elapsed Time) zur Laufzeit veranlassen. Das Binden mit EXPLAIN-Option veranlasst ein "Static Explain". Um bereits vor dem Bind den voraussichtlichen Zugriffspfad von Explain ermitteln zu lassen, also einen "Dynamic EXPLAIN" auszuführen, extrahiert man das jeweilige Statement aus dem Programm und ersetzt die Host-Variablen durch Konstante. Der "Dynamic Explain" wird sich dann wie ein "Static Explain" verhalten. 3.2.11 Komplexität von Queries Man sollte sicherstellen, dass die SQL Query so einfach und effizient wie möglich formuliert ist. Die Auswahl nicht benötigter Spalten und unnötige ORDER BY oder GROUP BY Anweisungen sind unbedingt zu vermeiden. Dennoch sollte man diese Aussage nicht missverstehen und SQL-Funktionen oder gar relationale Funktionen selbst programmieren. DB2 wird in jedem Fall jede Datenbankaufgabe schneller lösen können, als eine vergleichbare programmierte Sequenz. – wer kennt schon die DB-Umgebung besser als das System DB2 selbst? © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 29 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 3.2.12 Spalten-Funktionen Werden Column Functions eingesetzt, sollten diese so einfach wie möglich gestaltet sein, damit die Wahrscheinlichkeit, dass sie bereits aufgeführt werden, wenn die Daten beschafft werden, und nicht erst im Anschluss daran, möglichst hoch ist. Grundsätzlich kann man sagen, dass Column Functions am effizientesten sind, wenn sie nicht erst während der Sort-Phase des Statements ausgeführt werden. Um Column Functions bereits während des Datenzugriffs zu ermöglichen, müssen folgende Bedingungen vorliegen: GROUP BY benötigt keinen Sort (EXPLAIN-Output prüfen). Kein Stage-2-Prädikat verwenden. Dies ist in der Anwendung zu formulieren. Keine Distinct-Set Funktion (wie z.B. COUNT(DISTINCT C1)). Beinhaltet die Query einen Join, dann beziehen sich alle Set Functions auf die letzte Tabelle des Joins (EXPLAIN-Output prüfen). Alle Column Functions beziehen sich auf eine einzige Column ohne arithmetischen Ausdruck, ausgenommen die Column Functions VARIANCE and STDDEV, die niemals während einer „Retrieval“-Aktion ausgeführt werden können. 3.2.13 Formulieren von Prädikaten Manche Formulierungen in den Prädikaten schließen eine Indexnutzung bei DB2 aus (siehe Pkt.: 4.7.2.2 und 4.7.2.3 ff.) . Deshalb folgende Empfehlungen: • Prädikate die Indexes nutzen könnten, sollten bevorzugt werden • Unabsichtlich redundante oder unnötige Prädikate sind zu vermeiden • Deklarierte Längen von Host Variablen darstellen: Die Länge deklarierter Host-Variablen (HV) darf nicht länger sein als das Attribut der Datenspalte, mit der die Host-Variable korrespondiert. Wenn die HV-Länge größer ist, wird das Prädikat ‘Stage-2‘ und kann niemals passendes Prädikat für einen Index Scan werden. Folgende Host Variable und SQL Tabellenspalte sei angenommen: Assembler Declaration SQL definition MYHOSTV COL1 DECIMAL(6,3) DS PLn ‘value‘ Bild-12: Deklaration von HOST-Variablen Die Präzision der Host-Variablen beträgt 2n-1. Bei n = 4 und Wert = ‘123.123‘ würde das Prädikat, wie nachfolgend dargestellt, kein passendes sein, weil die Präzisionen (7,0 und 6,3) unterschiedlich sind: ... WHERE COL1 = :MYHOSTV Eine Möglichkeit solche ineffizienten Prädikate zu vermeiden besteht darin, HostVariablen ohne Längenoption zu versehen, also MYHOSTV DS P‘l23.l23‘ Dies garantiert die identische Attributdefinition wie die der SQL Spalte. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 30 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 3.2.14 Die Verwendung von „scalar functions“ Die Verwendung von skalaren Funktionen, wie SUM, MAX, MIN, AVG, COUNT, LENGTH, VALUE, CHAR, DATE, DECIMAL, DIGITS usw., sollte immer mit Vorsicht zu erfolgen. Es ist genauestens zu prüfen, ob Programmfunktionen in Anwendungsprogrammen nicht dieselbe Wirkung und Funktionalität besitzen, ohne den DB2-Kernel unnötig zu belasten. DB2 ist ein Meister in relationaler Funktionalität aber kein Konvertieroder Rechenprogramm. 3.2.15 Neuordnen der Tabellenfolge in der FROM Klausel Die Reihenfolge der Tabellen oder Views in der FROM Klausel kann die Auswahl des Zugriffspfads beeinflussen. Wenn die Query langsam läuft kann dies deshalb sein, weil die "join sequence" ineffizient ist. Man kann die "join sequence" innerhalb eines Query-Blocks aus der Spalte PLANNO in der PLAN_TABLE ersehen (siehe auch Pkt. 7.2 ff.). Eine Neuanordnung der Tabellen oder Views in der FROM Klausel kann zu einer besseren Performance der Query führen. Es sollte Dabei darauf geachtet werden, dass in den verschiedenen JOIN-Verfahren immer die Tabelle/View mit den kleineren Join-Resultaten als äußere Tabelle beim Join verwendet wird. 3.2.16 „list prefetch“ “Index screening” ist genau die richtige Medizin für exzessive “list prefetch”Operationen. „List prefetch“ erfolgt immer, wenn Indizes nicht genau zur WHEREKlausel passen. Beispiel: Index: c1, c2, c3, c4 WHERE c1 = xx AND c3 = yy AND c4 = zz Bisher wurde nur die c1 Spalte genutzt, um die RID’s für den „list prefetch“ zu finden. Jetzt werden auch die Spalten c3 und c4 überprüft, um die entsprechenden RID’s vor dem „list prefetch“ zu eliminieren. Damit wird die Last für den RID Pool reduziert, über die ansonsten „RID Pool failures“ und andere Probleme hervorgerufen werden. 3.2.17 Uncommitted read“ Wenn irgend möglich sollte das “isolation level” uncommitted read”(UR) gesetzt werden. UR vermeidet unnötigen „lock overhead“. Am einfachsten wird die Nutzung von UR bei „read-only“ Daten. Jede Tabelle, die als „read-only“ erkannt und analysiert ist sollte im SELECT-Statement die Klausel WITH UR enthalten. Bei langlaufenden Queries auf den Clients können nach Erfahrungen so bis zu 30% CPU-Zeit gespart werden. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 31 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 3.2.18 “row level locks” Man sollte “row-level locking“ vermeiden wo immer es geht. Oft wird RLL („row level locking“) genutzt, um Probleme bei der Parallelverarbeitung zu vermeiden. Meist jedoch erzeugt diese Vorgehensweise mehr Probleme als sie löst. Besonders, da diese Verfahrensweise zu einer potentiellen Steigerung von „deadlock“-Situationen führt, indem sie mehr als einen Prozess pro Page zulässt. 3.2.19 Freigabe von Locks In n-tier Umgebungen verursachen “locks” die Belegung von aktiven oder inaktiven „threads“ nach einem Commit. In der Komponente DB2-Connect kann man den Parameter cursorhold auf 0 (kein “default”) setzen, was dazu führt, dass Sperren nach einem „commit“ aufgehoben werden. Zusätzlich dazu sollte man den Parameter autocommit überprüfen, der unterschiedlich, z.B. in ERP-Systemen, eingesetzt werden kann. So setzen manche ERP Systeme den Parameter autocommit auf 0, um „commits“ zwischen den SQLStatements zu unterbinden, da alle „commits“ in der Applikation ausgelöst werden. In anderen Fällen ist der autocommit unerlässlich, z.B. in Tuxedo-Umgebungen. 3.2.20 “lock escalation” Bei bestimmten TS ist es sinnvoll “lock escalation” auszuschalten. „Lock escalation“ kann in einigen Situation durchaus zu einer echten Performance-Bremse werden. Wenn man LOCKMAX in der TS-Definition auf 0 setzt, schaltet man „lock escalation“ für diesen Tablespace aus. Zudem sollte LOCKSIZE auf PAGE oder ROW gesetzt sein. Bei "partitioned table spaces" (PTS) sollte das „selective partition locking“(SPL) eingeschaltet sein (LOCKPART YES). Dies verursacht nur bei den benutzten Partitions Sperrungen, nicht aber auf allen anderen – auch den nicht verwendeten. Bedingungen, die SPL verhindern, sind: • Type 1 Index wird im „access path“ verwendet • Der Plan wurde mit ACQUIRE(ALLOCATE) gebunden • Der TS wurde mit LOCKSIZE TABLESPACE erstellt • LOCK TABLE IN EXCLUSIVE MODE wurde ohne PART Angabe gesetzt. 3.2.21 "materialized query tables"(MQT's) und "automatic query rewrite"(AQR) Materialized query tables sind Tabelle, die Informationen enthalten, die aus anderen Tabellen gewonnen werden. MQT's speichern Resultate aus vorangehenden Queries , die aufwendige Joins und Aggregationsoperationen durchführen. Indem die gewonnene, zusammengefasste Information aufbewahrt und vorgehalten wird, können MQT's folgende Query-Verarbeitung vereinfachen und die Performance von "dynamic SQL queries" erheblich verbessern. MQT's sind deshalb besonders oft in "data warehousing applications" zu finden. Automatic query rewrite (AQR) ist der Prozess bei DB2, der zur Verarbeitung von Daten aus einer MQT führt. Wird AQR zugelassen, dann entscheidet DB2 selbst, ob © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 32 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 es eine "dynamic query" oder einen Teil daraus über die Nutzung einer "materialized query table" schneller erledigen kann. Wenn ja, wird DB2 die Query so umformulieren ("rewrite"), dass anstatt der originalen Tabelle(n) die MQT verwendet werden kann. Dabei ist zu beachten, dass eine MQT Query-Resultate enthalten kann, die nicht "ad hoc"-aktuell sind – vor allem, wenn die betroffenen "base tables" nach der Erstellung der MQT öfter geändert wurden. Zu diesem Thema gibt es in der einschlägigen Literatur folgende Punkte nachzulesen: • • • • • • Einführung in MQT's und AOR Definition einer MQT Aufbau von MQT's Security und MQT's Nutzung von AQR Beispiele zu MQT’s und AOR 3.2.21.1 Empfehlungen für das Design von "materialized query tables" Die folgenden Empfehlungen betreffen direkt das Design von MQT's: • "Aggregate Functions" sollten strategisch im Fullselect einer "materialized query table"-Definition berücksichtigt werden: - - COUNT(*) und SUM(Ausdrücke) SUM(expression*expression) nur , wenn auf VAR(expression), STDDEV(expression), VAR_SAMP(expression), oder STDDEV_SAMP(expression) abgefragt werden soll. COUNT(expression) zusätzlich zu COUNT(*), fall der Ausdruck "nullable" sein sollte. MIN(expression) und MAX(expression), wenn dies abgefragt wird NICHT: AVG(expression), VAR(expression), oder STDDEV(expression) direkt, falls eine der folgenden Parameter Kombinationen genutzt werden sollte: SUM(expression), SUM(expression*expression) und COUNT(*) SUM(expression), SUM(expression*expression) und COUNT(expression) DB2 kann AVG(expression), VAR(expression) und STDDEV(expression) aus SUM(expression), SUM(expression*expression) und der zugehörigen COUNT "aggregate function" ableiten. • Der "foreign key" einer "dimension table" einer GROUP BY Klausel einer MQT Definition sollte ebenfalls in der MQT vorhanden sein; z.B. wenn PGROUP.ID existiert, sollte auch PGROUP.LINEID existieren. DB2 kann dann die MQT verwenden, um eine Summierung auf der Ebenen LINEID vorzunehmen, ohne über PGROUP erneut zu "joinen" • Alle "higher-level columns" in der MQT sollten vorhanden sein, da DB2 die funktionale Abhängigkeit einer denormalisierten "denormalized dimension table" nicht kennt; z.B. CITY in einer GROUP BY Klausel impliziert auch STATE und COUNTRY für diese Klausel. Ebenso wie MONTH in der GROUP BY Klausel ebenfalls YEAR impliziert. • HAVING Klauseln haben in der MQT nichts verloren. Eine "materialized query table" mit HAVING in ihrer Definition besitzt nur eine limitierte Verwendbarkeit während des "query rewrite". • Erzeugen Sie IX auf “materialized query tables”, wie Sie sie auch auf den Basistabellen anlegen würden. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 33 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 3.2.21.2 Empfehlungen für das Design von zugehörigen "base tables" Die folgenden Empfehlungen betreffen die Strategien zum Design der Basistabellen und dienen der Performancesteigerung und einer erhöhten Anwendbarkeit von “materialized query tables”: • "referential integrity" sollte wann immer möglich entweder als ENFORCED oder NOT ENFORCED definiert sein. Ebenso sollte ein IX als UNIQUE definiert werden, wenn er „eindeutig“ ist. • Alle "base table" Spalten sollten wo immer möglich als NOT NULL definiert sein, sodass COUNT(X) genauso möglich wird wie COUNT(*). In diesem Fall muss man nicht auch noch COUNT(X) für jede "nullable column" X in einer MQT Definition vorsehen. Falls nötig sollte ein spezieller Wert definiert werden, der den NULL-Wert ersetzt. • Normalisierte Tabellen sollten denormalisierten Tabellen im "base tables"Umfeld vorgezogen werden. Nutzt man normalisierte Tabellen, so kann man "non-primary key columns" für eine MQT eher vernachlässigen und spart damit nebenbei auch noch Speicherplatz. DB2 kann das Fehlen von "non-primary key columns" kompensieren, indem es diese Spalten über einen Join auf eine "dimension table" immer noch gewinnen kann. Ist Performance ein Aspekt, so kann man MQT's auch so definieren, dass die so genannten "snowflake dimensions" denormalisiert dargestellt werden. 3.2.22 Der DB2-Katalog Es ist wichtig, den Katalog sauber und ordentlich zu verwalten. Normalerweise nämlich ist die Anzahl „packages“ und DB2-Objekte in einer Produktionsumgebung nicht unerheblich. Der Katalog sollte keine unnötigen Objekte enthalten und ebenfalls von Zeit zu Zeit reorganisiert werden. Dies ist Aufgabe einer leistungsfähigen DBA. Erfahrungen zeigen eine Reduktion von I/O’s um ca. 10 bis 12 Prozent und eine Reduktion von „elapsed time“ um ca. 11 bis 14 Prozent nach einer Reorganisation. In einigen Fällen, z.B. bei starker Fragmentierung wurden sogar bis zu 50% Reduktion der I/O Tätigkeit nach einem REORG des Katalogs erzielt. 4 SQL-Tuning und Performance bei DB2 Das Tuning von SQL Queries kann folgende Aktivitäten erfordern: • Hinzufügen und/oder Ändern von Indizes • Anpassen der Spaltengrössen in Tabellen • Neuschreiben von Queries Insbesondere Queries, die Bestandteil von angepasstem Code, generierten Abfragen und benutzerverfasste Queries bedürfen häufig eines Tuning. Insbesondere bei Reporting Aufgaben überschreiten die generierten Queries schon einmal die erlaubte Anzahl von 15 Tabellen in einem Join in der DB2 Version 5. Seit DB2 Version 6 sind bis zu 255 Tabellen in einem SQL-Statement verarbeitbar, aber nur 15 „joined“-Tabellen in einem SQL-Statementblock erlaubt. Ab DB2 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 34 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Version 8 sind es bis zu 225 Basistabellen, die in einer einzigen "joined expression" stehen können. Joins über Spalten mit ungleicher Länge führten bis zur Version 5 zu PerformanceProblemen. Seit DB2 Version 6 kann DB2 dies über zusätzliche interne Funktionen kompensieren. Dennoch sind nach der Migration betroffene Indizes anzupassen. In Version 8 wird DB2 über "query rewrite"-Funktionalitäten derartige User-Fehler weitgehend beheben können. Neue „features“ bestehender oder neuer Funktionen in neuen Releases von DB2 werden seltenst in „alten“ Queries genutzt und eingebaut, obwohl DB2 daraus Vorteile ziehen könnte. Nur allzu wenig wird z.B. die Verwendungsmöglichkeit von CASE – Konstrukten beachtet. Mit CASE kann man in SQL „UNION Konstrukte“ minimieren/eliminieren bzw. restrukturieren. In einem 5-fachen UNION Block beispielsweise kann alleine über den Weg von CASE-Formulierungen eine Reduzierung von „elapsed time“ und CPU-Zeit von bis zu 80% erzielt werden. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 35 von 127 DB2-Optimierung und SQL-Performance 4.1 Kapitel 11: Anhang – Index Die neuen Limits bei DB2 Version 8 Folgende Begrenzungen in DB2 Version 8 haben sich im Vergleich zu den vorhergehenden Versionen verändert: • Die Größe des Virtual Storage von 2 GB (231 Bytes) auf 16 EB (= Exabytes = 264 Bytes) das sind 16 Milliarden GB(!) • Maximale Länge von Table- & Viewnames von 18 auf 128 Zeichen • Maximale Länge der Columnnames von 18 auf 30 Zeichen • Die maximale SQL Statement Länge von 32K auf 2 MB • Die Länge von “Character Literals” von 255 auf 32704 Zeichen • Die Anzahl Tables in einem Join von 15 auf 225 • Die Maximale Anzahl Partitions in einem PTS von 254 auf 4096 • Die Anzahl von “Active logs” von 31 auf 93 • Die Anzahl “Archive logs“ von 1000 auf 10,000 Zusätzlich wurde einige der wichtigsten internen (systemtechnischen) Grenzen aufgehoben: • Veränderungen im Maschinencode (64-Bit Architekturen) • Mehr Realspeicher (reduziert das "paging") • Mehr "threads", • größere Bufferpools, • mehr Anwendungen parallel • mehr Objekt • größere Objekte usw. Für komplexe Joins sollten auch die ZPARMs in der DB2-Umgebung entsprechend angepasst werden: Bild-13a: Neue SQL-wirksame „ZPARMs“ in DB2 V8 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 36 von 127 DB2-Optimierung und SQL-Performance 4.2 Kapitel 11: Anhang – Index Die DB2 SQL Engine Im Folgenden wird die generelle Verarbeitung von SQL-Statements in DB2 dargestellt und welche Fragestellungen der Optimizer zu beantworten hat, bevor er über die Zugriffe auf eine DB2-Tabelle entscheidet. SORT ? Wieviele Rows? RID Sort ? View Materialized? Table Expression ? BIND/Optimize ORDER BY Calling CallingProcess Process Colum function ? DSNDB07 Relational Data Server Filtering ? (Non-sargable SORT? Stage 2) D B 2 E N G I N E RESULT SETS Global Temp Tables Column Functions ? Data Manager Filtering ? (Sargable Stage 1) Welcher Index ? Welche Spalten ? Wieviele „matching“ ? Index Only ? DB2 Catalog DB2 Directory DB2 Indexe DB2 Tabellen Table Scan Oder Partition Scan ? Bild-14: Die DB2-SQL „Engine“ Die kritischen Fragen sind: • • • • • • • • • • • • Werden Indexe genutzt ? Wird „list prefetch“ angesteuert ? Sind alle Spalten im Index korrekt ? Wie viele der Spalten passen zu den Queries (matching) ? Werden weniger als alle „columns“ verwendet, gibt es Statistiken über die Kardinalität dieses „subsets“ ? Wurde „index-only“ Zugriff verwendet – oder sollte er verwendet werden ? Wurden „column functions“ in Stage1 , Stage2 oder anderswo aufgelöst ? Könnten sie eventuell während der Datenwiedergewinnung aufgelöst werden ? Wird ein ORDER BY über einen Index bedient oder wird ein SORT ausgelöst? Wie viele „rows“ werden von Stage1 an Stage2 übergeben ? Wird ein View genutzt und materialisiert ? Wird eine „table expression“ genutzt und materialisiert ? Wurde alles, was möglich ist für die Daten getan, bevor sie ans Programm zurückgegeben werden ? © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 37 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Dies alles resultiert in einem einfachen Grundsatz: Sei so selektiv wie möglich ! Nach dem Lesen von Index und Daten sollten soviel Daten wie möglich über Stage1Prädikate gefiltert werden. Dies macht einige Schwierigkeiten, da mit jedem neuen Release von DB2 immer mehr Prädikate auf Stage1 gedrückt werden, dennoch aber heißt dies nicht, dass wenn ein Prädikat in Stage1 potentiell „indexable“ ist, es auch in Stage1 verarbeitet wird (siehe auch Pkt. 6.2.1 ff). Jede Filterung, die nicht in Stage1 erledigt werden kann geht an Stage2 zur Erledigung – an den RDS Layer. Viele dieser Funktionen, wie „scalar functions“, Aggregation, Sortieren und anderes könnte genauso gut in Stage1 verarbeitet werden, wenn SQL anders formuliert wäre. Noch häufiger wird in Stage2 keinerlei Verarbeitung erledigt und die Daten werden lediglich an das User-Programm weitergegeben. Grundsätzlich gilt: Alles, was nicht in Stage1 verarbeitet werden kann, wird in Stage2 erledigt. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 38 von 127 DB2-Optimierung und SQL-Performance 4.3 Kapitel 11: Anhang – Index SQL-Tuning und die Logik von Abfragen Unabhängig vom Datenbanksystem und vom damit zusammenhängenden SQLDialekt, gibt es Regeln der mathematischen Logik, nach denen man alle logischen Anfragen (auch in SQL) ohne die Gefahr des Verfälschens von Ergebnissen umformulieren kann. Hier einige Beispiele: 4.3.1 “constant propagation” Das Transitivitätsgesetz in der mathematischen Logik stellt folgendes fest: IF AND THEN AND NOT ( A <vergleichsoperator> B ) IS true ( B <vergleichsoperator> C ) IS true ( A <vergleichsoperator> C ) IS true ( A <vergleichsoperator> C ) IS false <vergleichsoperator> kann dabei sein: =, >, >=, <, <= NICHT aber: <> oder LIKE (!) Bild-15: Transitivitätsgesetz der mathematischen Logik Das Transitivitätsgesetz führt zur Erkenntnis, dass man z. B. C mit B ersetzen kann, ohne eine Änderung der Bedeutung eines Ausdrucks zu verursachen. Diese Substitution einer Konstanten nennt man „constant propagation“. Die folgenden zwei Ausdrücke meinen dasselbe, aber die zweite Formulierung ist besser, da ein „column“-Name durch ein Literal(5) ersetzt wird: Fall-1: SELECT …. FROM WHERE AND AND tab_1 t1.col1 t1.col2 t1.col1 t1 < = = t1.col2 t1.col3 5 Fall-2: SELECT …. FROM WHERE AND AND tab_1 5 t1.col2 t1.col1 t1 < = = t1.col2 t1.col3 5 Bild-16: Transitivitätsgesetz der mathematischen Logik – Beispiel-1 Der Ausdruck in Fall-2 wird auch Transformation des Ausdrucks in Fall1 genannt. Einige gute DBMS-Systeme führen diese Transformation eigenständig und automatisch durch (siehe Pkt. 4.4.2.1). © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 39 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Manche DBMS versuchen keine Transformationen, wenn die Gefahr besteht, dass eine Query dadurch langsamer werden könnte, z. B. eine Transformation von Ausdrücken mit NOT: Fall3: SELECT …. FROM WHERE AND NOT tab_1 t1 t1.col1 = ( t1.col3 = t1.col2 ) Manuelle Lösung: SELECT …. FROM WHERE AND AND tab_1 t1.col1 t1.col3 t1.col2 5 7 OR t1.col1 = t1 = 5 <> 7 <> 5 Bild-17: Transitivitätsgesetz der mathematischen Logik – Beispiel-2 Das transformierte Statement ist in DB2 ca. 50% schneller als das Original. In anderen Worten: Manchmal zahlt es sich aus Transformationen selbst vorzunehmen. „constant propagation“ funktioniert manchmal nicht mit „float“ Daten: Sie können sowohl „größer als“ und „gleich“ sein, wenn numerische Vergleiche gemacht werden. Wenn die Methode möglich ist, kann man von einem Performance-Gewinn von ca. 5/8 ausgehen. Andererseits funktioniert die „constant propagation“ oft nicht bei CHAR-Ausdrücken. Wenn sie möglich ist, ist auch eine Performance-Verbesserung von 4/8 drin. 4.3.2 Eliminieren von „totem Code“ In manchen alten SQL-Programmen findet man auf beiden Seiten des Operators Literale, wie im folgenden Beispiel: SELECT FROM WHERE AND * tab_1 0 t1.col1 t1 = = 1 ‘I hope we never execute this’ Bild-18: Eliminieren von „totem Code“ Die Query liefert immer 0 “rows” zurück. DBMS-Systeme könnten die gesamte WHERE-Klausel ignorieren. Aber: Nicht alle tun dies. - Ein Test ergab, dass die Query-Formulierung SELECT FROM * tab_1 t1 ohne WHERE-Klausel einen Performancegewinn von ca. 5/8 gegenüber einer Klause, wie der oben gezeigten, brachte. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 40 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Nun sind die beiden Queries ja nicht identisch. Dennoch sollte eine Query, die 0 „rows“ liefert schneller sein, als eine, die ein Resultat mit mehreren „rows“ abzugeben hat und zudem einen TS Scan durchführen muss. Das Beispiel zeigt, dass nicht alle DBMS „false“-Bedingungen und ihre abhängigen Konditionen in der PREPARE-Phase eliminieren. Dennoch sind die DBMS ziemlich hartnäckig im Eliminieren von „always-true“ Konditionen. Beispielsweise kann man die Rückgabe von Werten mit geringer Präzision steuern, indem man eine zusätzliche Bedingung in die WHERE-Klausel mit aufnimmt. Beispiel: SELECT FROM WHERE OR * tab_1 t1 ( 77 / 10 = 7.7 AND t1.col1 / 10 = 7.7 ) ( 77 / 10 = 7 AND t1.col1 * 10 = 77 ) Bild-19: Zusätzliche Bedingung in der WHERE-Klausel – Beispiel Der Performancegewinn kann in diesem Fall wiederum bis zu 5/8 betragen. Natürlich kann es zunächst keine gute Idee sein, redundanten Code in ein SQLStatement einzubauen. Aber: Angenommen eine Spalte ist eine „indizierte NOT NULL“-Spalte. Dann könnte man aber das folgende Statement wie folgt transformieren: SELECT * SELECT FROM WHERE * FROM tab_1 t1 In: tab_1 t1 indexed_column > 0 Bild-20: Zusätzliche Bedingung in der WHERE-Klausel mit „UNIQUE NOT NULL“ – Beispiel Dies wiederum veranlasst DB2 beispielsweise zu einer Suche nach einem passenden und möglicherweise über einen Index. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 41 von 127 DB2-Optimierung und SQL-Performance 4.3.3 Kapitel 11: Anhang – Index Zusammenfassen von Konstanten („constant folding“) Jeder, der schon einmal C programmiert hat weiß, dass der Ausdruck x = 1+1-1-1 zu x=0 zum Compile-Zeitpunkt umformuliert wird. Da mag es überraschen, dass die SQL-fähigen DBMS Systeme folgende Ausdrücke nicht ebenfalls auf die gleiche Weise behandeln: … WHERE col1 … WHERE 5 … WHERE col1 … CAST ( 1 AS INTEGER ) … WHERE ‚a’ + 0 + 0.0 IN ( 1, 3, 3 ) || ‚b’ Bild-21: Zusammenfassen von Konstanten in der WHERE-Klausel – Beispiel Findet man in altem SQL-Code solche Formulierungen, dann lasse man sie so wie sie sind. Sie sind eventuell bzw. sicher geschrieben, um Indexzugriffe zu verhindern, den Datentyp einer „result column“ zu ändern, eine Limitierung in der Zeilengröße zu überwinden oder – na ja. Wie auch immer, die Empfehlung für Transformation lautet hier: … WHERE a - 3 = 5 … WHERE a = 8 nach umzuwandeln. 4.3.4 “case-insensitive” Suchen Die meisten Datenbanken unterscheiden bei der Suche nach Objekten und Daten zwischen Groß- und Kleinschreibung (MS-Access beispielsweise nicht). Die meisten User verwenden für die so genannte „case-insensitive“ Suche die Funktion UPPER. Dies kann jedoch schon in dem Augenblick ein Fehler sein, wo mit anderen Buchstaben als denen der reinen Lateinschrift gearbeitet wurde. Beispiel: … WHERE … UPPER( ‘résumé’ ) Bei der Transformation geht Information verloren. Die obige Anweisung liefert RESUME als Ergebnis. Und das ist die Bedeutung des Wortes von „curriculum vitae“(engl.) zu „starte erneut“. So scheint es besser, die Funktion LOWER zu verwenden, da so keine Information verloren gehen kann. Beispiel: … WHERE LOWER(col1) = ‘résumé’ Bild-22: „case insensitive“ Suche – Beispiel © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 42 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Ist man unschlüssig, ob Daten in Groß- oder Kleinschreibung bzw. sogar gemischt auf der Datenbank abgespeichert sind, so sollte man grundsätzlich Funktionen auf Spalten in der WHERE-Klausel vermeiden. Beispiel: WHERE OR col1 = ‘SMITH’ col1 = ‘Smith’ Bild-23: „case insensitive“ Suche – Beispiel Diese Formulierung ist immer noch langsam. Die Empfehlung ist, das DBMS nur dann zum „case-sensitive search“ zu veranlassen, wenn dies erforderlich ist. WHERE OR col1 = ‘SMITH’ ( ‘SMITH’ <> ‘Smith’ AND col1 = ‘Smith’ ) Bild-24: „case insensitive“ Suche – Beispiel Dies bringt eine ungefähre Verbesserung der Performance von geschätzt ca. 3/8. 4.3.5 „Sargability“ Die ideale Form eines SQL-Prädikats hat die Form: <column> <vergleichsoperator> <literal> IBM nennt solche Prädikate „sargable“. SARG ist eine Abkürzung für „Search ARGument. Später wurde die Bedeutung auf „kann im Index gesucht werden“ erweitert. Wie auch immer: Es ergibt sich daraus eine Empfehlung die heißt: Die linke Seite eines Such-Prädikates sollte möglichst ein einfacher Spaltenname sein; die rechte Seite sollte einen einfachen Suchbegriff enthalten! Dem folgend transformieren alle DBMS die folgenden Ausdrücke: 5 = <col1> - 3 = <col1> - <col2> nach: nach: <col1> = <col1> = 5; - <col2> + 3; Bild-25: „Sargability“ Dies kann zu einem Performanceerfolg von ca. 4/8 Verbesserung führen. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 43 von 127 DB2-Optimierung und SQL-Performance 4.3.6 Kapitel 11: Anhang – Index "Join transitive closure" Auch die Methode des "transitive closure" zum Verbinden von Spalten, stellt eine von SQL unabhängige Methode der Umformung von Queries dar. Sie ist eine der Methoden der mathematischen Logik, logische Ausdrücke aufzulösen und zu berechnen, ohne die Logik zu verändern. Sie könnte auf der Optimizer-Ebene jederzeit implementiert werden Die folgende Query spezifiziert einen "equi-join" auf t1.c11 und t2.c21, und einen "equi-join" auf t2.c21 und t3.c31: select from where and and * t1, t2, t3 t1.c11 = t2.c21 t2.c21 = t3.c31 t3.c31 = 1 Ohne "join transitive closure" wäre die einzige richtige Reihenfolge der Tabellen (t1, t2, t3), (t2, t1, t3), (t2, t3, t1) und (t3, t2, t1). Fügt man die Joins auf t1.c11 = t3.31hinzu, wird der Optimizer versuchen, die Liste der Möglichkeiten zum Join um folgende Aspekte zu erweitern: (t1, t3, t2) und (t3, t1, t2). Über die "transitive closure" Regel kann die Bedingung t3.c31 = 1 auch auf die "join columns" von t1 und t2 angewendet werden. "Transitive closure" wird normalerweise ausschließlich auf "equ-joins" angewendet. "Join transitive closure" wird nicht verwendet für: • "Non-equi-joins"; beispielsweise, t1.c1 > t2.c2 • Equi-joins die einen Ausdruck beinhalten; z.B. t1.c1 = t2.c1 + 5 • Equi-joins mit einer or Klausel • Outer joins, z.B. t1.c11 <> t2.c2 oder left join oder right join • Joins über "subquery" Grenzen hinweg • Joins zum Prüfen von "referential integrity" oder der „with check option“ auf "views" • Spalten mit "incompatible datatypes" © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 44 von 127 DB2-Optimierung und SQL-Performance 4.4 Kapitel 11: Anhang – Index DB2 SQL und Performance Folgende Empfehlungen zur Konstruktion von SQL-Queries gelten immer dann, wenn eine der Forderungen Performance heißt. Die Aufzählung ist nicht unbedingt komplett, weist aber den Weg und die Methode zum Tuning von SQL. 4.4.1 Grundsätzliche Empfehlungen zu DB2-SQL 1. Holen Sie das absolute Minimum an Daten in die DB2 „Engine“. 2. Filtern Sie alle „non-qualifying“ Daten aus der Resultatsmenge 3. Geben Sie nur das absolute Minimum an Daten an den „requestor“ zurück 4. Erledigen Sie die Verarbeitung in der kleinsten Menge funktionaler SQL-Statements 5. Erledigen Sie soviel Funktionalität wie möglich im SQLStatement (nicht im Programm) Bild-26: DB2 SQL: Grundsätzliche Empfehlungen Alle diese Maßnahmen führen dazu, dass SQL letztlich mit einem Minimum an Ressourcen-Verbrauch ablaufen kann. Beispiel: DECLARE testcurs1 CURSOR SELECT abtnr , abtname , abtltnr FROM abteilung ..... FETCH testcurs1 INTO :hvn, :hvm :hvo IF sqlcode = 0 THEN DO LOOP DECLARE testcurs2 CURSOR SELECT persnr FROM mitarbeiter WHERE persnr = :hvo AND ausbst > 20 ........... FETCH testcurs2 INTO :hv3 ........... IF sqlcode = 0 THEN <fetch erneut> ELSE <loop erneut> endif endloop endif ......... © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 45 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index … das ist so nicht optimal !!!! Subselect: SELECT , FROM WHERE abtnr abtname abteilung abtltnr IN ( SELECT FROM WHERE persnr, mitarbeiter ausbst > 20 ) JOIN: SELECT , FROM , WHERE AND abtnr abtname abteilung mitarbeiter abtltnr = ausbst > 20 persnr, Bild-26: Evaluation eines „result sets“ – Beispiel – 1 4.4.1.1 Suche die kleinste „row“-Menge Nur die Daten sollten den „requestor“/Programm erreichen, die unbedingt gebraucht werden. Selten kommt es vor, dass alle Daten in ein Programm zu übergeben sind. Häufig ist dies ein Problem des physischen Design, weil Indexes fehlen oder aus anderen Gründen, die in der Implementierung liegen. Ein einfaches Beispiel wird im Pkt. 4.4.1.2 ff geliefert. Oft wird ähnliches SQL von Code-Generatoren erzeugt. 4.4.1.2 Lies nur die Spalten, die wirklich benötigt werden Beispiel: SELECT , , FROM WHERE kd# name betrag kunde kd# = :hv Genügen würde: SELECT , FROM WHERE name betrag kunde kd# = :hv Bild-27: Evaluation eines „result sets“ – Beispiel - 2 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 46 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Es gibt schlichtweg keinen Grund, die „kd#“ zu selektieren, wenn sie bereits bekannt ist – und das muss sie in diesem Fall ja wohl sein, sonst wäre die „hostvariable“ :hv nicht zu besetzen gewesen(!) Der Zugriffspfad basiert auf diesen Prädikaten. Um diese zusätzliche Spalte im Resultat unnötigerweise trotzdem darzustellen, geschieht folgendes: 1. Lesen aus der „Page“ in den Bufferpool 2. Übertragen aus dem Bufferpool in eine „User Work Area“ 3. Übergabe an Stage2 4. Übergabe über XMS an das Programm/QMF/SPUFI Dies bedeutet in jedem Fall unnötige Beschäftigung der CPU. Hier ist es nur eine „row“, aber wie viele Transaktionen und „rows“ und wie häufig passiert dies pro Tag ? – Nicht das einzelne SQL-Statement verursacht Schäden im DB2-Umfeld, vielmehr der Effekt der multiplen Nutzung lässt die Ressourcen knapp werden und den Aufwand ansteigen. Sollte das vorgenannte Statement in einem SQL vorkommen, das mehrere „rows“ zurückgibt und dies noch im Falle einer „child table“ zur Kundentabelle, dann wird die Situation bedenklich. Oft tritt der Fall ein, dass das Resultat sortiert angeboten werden muss und die Spalte ist erforderlich zur Nutzung bestimmter Indexes: Beispiel: SELECT ac.kd# , ar.rechn# , iv.betrag , it.teile# , it.teile_beschreibung , it.teile_kosten FROM kunde ac , auftrag ar , rechnung iv , teile it WHERE ac.kd# = :hv1 AND ac.kd# = ar.kd# AND ar.rechn# = iv.rechn# AND iv.teile# = it.teile# ORDER BY ac.kd#, ar.rechn#, iv.teile# Bild-28: Evaluation eines „result sets“ – Beispiel - 3 Es gibt in diesem Fall keine eindeutige Interpretation dessen, was passiert. Die Query bezieht sich auf eine einzelne „kd#“ und so kann es sein, dass die Spalte „kd#“ im SELECT nicht erforderlich ist. Es kann auch sein, dass die „kd#“ im ORDER BY SORT-Probleme verursacht. Dies ist ein Join über 4 Tabellen und die Chance, dass die „kd#‘ im ORDER BY für die Auswahl bestimmter Indexes zur Vermeidung von SORTs nötig ist, ist ziemlich unwahrscheinlich. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 47 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Diese Query könnte besser wie folgt geschrieben sein: SELECT ar.kd# , ar.rechn# , iv.betrag , it.teile# , it.teile_beschreibung , it.teile_kosten FROM auftrag ar , rechnung iv , teile it WHERE ar.kd# = :hv1 AND ar.rechn# = iv.rechn# AND iv.teile# = it.teile# ORDER BY ar.kd#, ar.rechn#, iv.teile# Bild-29: Evaluation eines „result sets“ – Beispiel - 4 Das Ergebnis ist identisch mit der ersten Query. Die Kundentabelle wird allerdings nicht mehr verwendet und folglich auch nicht im JOIN eingebunden. Der JOIN ist ein Join über 3 Tabellen anstatt über vier. Trotz der vielfältigen Möglichkeiten, die aufgrund der vielfältigen Variablen für diese Query bestehen, könnte man eine weitere Variante für ein besseres SQL wie folgt vermuten: SELECT iv.rechn# , iv.betrag , it.teile# , it.teile_beschreibung , it.teile_kosten FROM auftrag ar , rechnung iv , teile it WHERE ar.kd# = :hv1 AND ar.rechn# = iv.rechn# AND iv.teile# = it.teile# ORDER BY iv.rechn#, iv.teile# Bild-30: Evaluation eines „result sets“ – Beispiel - 5 Hier wurde die „kd#“ aus dem SELECT-Statement genommen, da der Wert bereits in der Hostvariablen „hv1“ enthalten ist. Es werden viele „rows“ zurückgegeben und so reduziert die Wegnahme der „kd#“ den Aufwand für die Query enorm. Zudem befinden sich nur noch zwei Spalten im ORDER BY anstatt drei und sortiert werden nur noch fünf Spalten anstatt sechs (siehe SELECT-Statement). Dies wiederum verkleinert die Anforderungen für SORT im Bufferpool und die I/O Aktivitäten dort. Es könnte jetzt auch der Fall eintreten, dass der SORT-Pool für das Sortieren ausreicht, während dies beim ersten Beispiel unwahrscheinlich(er) ist. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 48 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.3 Reduziere die Anzahl der SQL-Statements Jedes SQL-Statement bedeutet einen CALL an das DB2-Subsystem, was wiederum „overhead““ bedeutet. Dieser „overhead“ hängt eng mit dem Typ des SQL-Statement zusammen; die folgende Tabelle stammt von Akira Shibamiya und Michael Hannan (Australien): SQL-Typ SQL-Kosten zus. Kosten CICS OPEN und CLOSE zusammen 0.33 ms „task switch“ + 0.4 ms FETCH 0.12 ms „task switch“ + 0.2 ms Einzelner SELECT 0.11 ms plus „overhead“ wie im FETCH „task switch“ + 0.2 ms weitere Faktoren Plus „column overhead“ Class 2 accounting usw. Bild-31: Kosten von SQL-Statements(Übersicht) Diese Kosten basieren auf dem Einsatz eines IBM 3090-1870J Rechners und müssen für andere Umgebungen entsprechend angepasst werden. Das Problem sind nicht die Millisekunden, sondern die Tatsache, dass redundante und unnötige SQLs den „overhead“ sprunghaft ansteigen lassen. Die bekanntesten und schlimmsten Szenarios für wiederholte und unnötige SQLFormulierungen findet man in den bekannten Fällen der „Have you seen Jones“ Diskussionen, in denen wiederholte SQL-Statements für dieselbe „row“ abgesetzt, jedoch immer andere Spalten zurückgegeben werden. Die Korrektur hierzu ist nicht so einfach, wie sie zunächst scheint. Hier ein Beispiel in Pseudocode: SELECT Name und Adresse von Jones DO irgendwas IF fertig mit Jones THEN beende ELSE SELECT Telefon und Geburtstag von Jones DO irgendwas IF fertig mit Jones THEN beende ELSE SELECT Spitzname, Alias, email_adr IF fertig mit Jones THEN beende ELSE ….. Bild-33: Reduktion der Anzahl von SQL-Statements – Beispiel: „Have you seen Jones“ © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 49 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Eine “quick & dirty” Lösung ist zu einfach und trifft das Problem nicht genau: SELECT name, adresse, telefon, geburtstag, spitzname, alias, email_adr usw... Das eigentliche Problem liegt im prozentualen Anteil an Verarbeitung auf jeder Ebene. Wenn beispielsweise der Übergang auf den zweiten SELECT nur in 10% der Zeit erfolgt, dann werden alle „columns“ in 90% der Zeit ohne Grund wiedergewonnen. Wird die Query nur einmal pro Zeiteinheit benutzt, ist dies akzeptabel. Aber, wenn es sich um eine häufig auftretende Transaktion handelt, dann hat man ein Problem. Wenn die normale Verarbeitung durch alle funktionalen Ebenen läuft, dann kann das SQL-Statement zu einem einzigen zusammengefasst werden, das alle Spalten zurückgibt. Manchmal jedoch ist es nicht offensichtlich, wo Redundanz eigentlich entsteht. – Es gibt keinen Fehler im SQL-Statement, aber es handelt sich um den klassischen Fall des so genannten „cut and paste“ SQL, was immer zu einem Desaster führen muss. In unserem Fall existieren in einem Programm drei Cursor. Jeder wird über „cut and paste“ vom Original aus aufgebaut. Jeder Cursor basiert auf einem eigenen „rule set“ und gibt ein anderes Resultat zurück. Das SQL dieser drei Cursor wird nun zu einem SQL SELECT zusammengefasst. Die Unterschiede der folgenden SQL SELECTs bestehen in der WHERE - Klausel und den Hostvariablen, die die Ergebnisse aufnehmen: SELECT Statement1: SELECT FROM WHERE AND AND AND AND AND SUM(cumqty) INTO :ws-cat-1 kd_konto ar teile_typ = :ws-item-typ teile_mengen-klasse = :ws-amount-class gruppen# = :ws-group-num teile_jahr = :ws-teile-jahr transaktion_code IN (208, 400, 434, 441) transaktion_datum = ( SELECT MAX(transaktion_datum) FROM kd_konto ) SELECT Statement2: SELECT FROM WHERE AND AND AND AND AND © S.K. Consulting Services SUM(cumqty) INTO :ws-cat-2 kd_konto ar teile_typ = :ws-item-typ teile_mengen-klasse = :ws-amount-class gruppen# = :ws-group-num teile_jahr = :ws-teile-jahr transaktion_code IN ( 210, 211, 221, 223, 224, 225 ) transaktion_datum = ( SELECT MAX(transaktion_datum) FROM kd_konto ) ++49 8106 994390 www.sk-consulting.de Seite 50 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index SELECT Statement3: SELECT FROM WHERE AND AND AND AND IN AND SUM(cumqty) INTO :ws-cat-3 kd_konto ar teile_typ = :ws-item-typ teile_mengen-klasse = :ws-amount-class gruppen# = :ws-group-num teile_jahr = :ws-teile-jahr transaktion_code ( 034, 100, 104, 105, 106, 332, 334, 341 ) transaktion_datum = ( SELECT MAX(transaktion_datum) FROM kd_konto ) Bild-34: Redundanz in SQL-Statements – Beispiel Die Performanceverbesserung entsteht bei der Zusammenfassung der wiederholten SQL-Statements zu einem „single“-Statement (Cursor), sodass drei Suchvorgänge auf eine Tabelle zu einem einzigen konsolidiert werden, z. B.: SELECT Statements(konsolidiert): SELECT SUM( CASE WHEN transaktion_code = 034 ... = 341 THEN cumqty END ) SUM( CASE WHEN transaktion_code = 208 ... = 441 THEN cumqty END ) SUM( CASE WHEN transaktion_code = 210 ... = 225 THEN cumqty END ) INTO :ws-cat-1, :ws-cat-2, :ws-cat-3 FROM kd_konto ar WHERE teile_typ = :ws-item-typ AND teile_mengen-klasse = :ws-amount-class AND gruppen# = :ws-group-num AND teile_jahr = :ws-teile-jahr AND transaktion_code IN (208, 400, 434, 441, 210, 211, 221, 223, 224, 225, 034, 100, 104, 105, 106, 332, 334, 341 ) AND transaktion_datum = ( SELECT MAX(transaktion_datum) FROM kd_konto ) Bild-35: Redundanz in SQL-Statements – Lösung Wiederholbare oder redundante SQL Statements gibt es innerhalb eines Prozesses normalerweise nicht allzu viele. Aber geht man davon aus, dass ein Prozess mehrfach wiederholt wird, dann schon, z.B. täglich häufig angestoßene OLTP Transaktionen. Man stelle sich vor, eine Aktion, wie z.B. „get current date“ wird pro Tag zwei millionenmal ausgeführt! © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 51 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Man könnte viel CPU-Zeit für Calls sparen, wenn man diese Aktion unterbinden könnte. Auch wenn es sich um ein 24x7 System handelt, kann man derartige SQLCalls kontrollieren. Die fundamentalen Regeln hierzu lauten: Make it work ! Make it work right ! Make it work fast ! Standards in Unternehmen verhindern oft die Verwendung eines „single“ SQL Statements und erlauben lediglich die Nutzung von Cursor-Verarbeitung. Der zusätzliche Ressourcenverbrauch kann abgeschätzt werden, indem man die o.g. Zeiten für derartige Aktionen betrachtet, die nur eine oder 0 „rows“ zurückgeben. OPEN FETCH CLOSE CURSOR curs curs INTO ..... curs Gegenüber SELECT ... FROM <table>; Bild-36: Unnötiger Ressourcenverbrauch durch CURSOR – Beispiel In beiden Fällen werden Cursor genutzt. Im zweiten Fall jedoch wird der Cursor innerhalb von DB2 aufgebaut, geöffnet und geschlossen ohne Kosten für XMS und zugehörige „entry“- und „exit“-Code-Strecken zu verursachen. Wann immer nur 0 oder 1 „row“ von einem SQL-Statement als Ergebnis erwartet wird, sollte niemals ein Cursor kodiert werden. In OLTP Transaktionen mit hoher Nutzungsfrequenz würde so der „overhead“ beachtlich. Kurz und gut: Ein „single“ SQL-Statement sollte verwendet werden, wenn 1. Normalerweise nur 0 oder 1 row zurückgegeben wird 2. Wenn kein SQLCODE –811 möglich ist 3. Wenn kein unnötiger „overhead“ erzeugt wird (über „prefetch“ oder „staging“ ....) Ein weiterer häufig vorkommender Fall sollte an dieser Stelle noch erwähnt werden: Falls eine OLTP Transaktion viele SQL-Statements enthält, so verursacht sie „task switch overhead“ für jeden dieser Aufrufe. Für gute Performance ist es besser diese gesamte Arbeit in eine „stored procedure“ zu verlagern. Oft können derartige OLTP-SQL-Statements über JOIN, inner/outer, usw. miteinander kombiniert werden. Dies verursacht nicht nur innerhalb von DB2 weniger Aufwand, es reduziert die „task switches“ und den SQL-„overhead“ einer Transaktion. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 52 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.4 Kodiere Prädikate, die möglichst selektiv sind Oft wird versucht nach der Methode vorzugehen: Ich kodiere das SQL und DB2 soll sehen, wie es damit zurechtkommt. Diese Vorgehensweise ignoriert die Performance-Ansprüche an SQL vollständig. Als Beispiel seien die u.a. Queries dargestellt, die alle die gleiche Antwort liefern: Query 1: SELECT FROM WHERE s.sname s s.s# IN ( SELECT WHERE sp.s# FROM sp sp.p# = ‘P2’ ) Query 2: SELECT FROM WHERE s.sname s EXISTS ( SELECT WHERE AND * FROM sp sp.p# = ‘P2’ sp.s# = s.s# ) Query 3: SELECT FROM DISTINCT s.sname s INNER JOIN sp ON s.s# = sp.s# WHERE sp.p# = ‘P2’ Bild-37: Selektive Prädikate – Beispiel Leider werden heute immer noch (DB2-)Entwicklungsansätze praktiziert die lauten: „Bring es durch den Precompiler, wenn es Daten zurückliefert - übergib es an die Produktion“. Enge Projekttermine forcieren genau diese Vorgehensweise. Betrachtet man allerdings die o.g. Queries, so ist es auch sehr schwer zu bestimmen, welche von ihnen die beste Filterung besitzt und am wenigsten „overhead“ erzeugt. Zum einen hängt die Aussage eng mit dem genutzten DB2 Release zusammen in deren Historie es immer wieder Verbesserungen zu genau dem vorliegenden Problem gab. – So kann man zunächst nicht sagen welche Formulierung am besten ist, zumal man nicht erkennen kann, welche Indexes existieren, wie die Kardinalität der Daten ist und welche Optimierungstechniken angewendet werden. Man weiß nur, die Antworten sind identisch, - und das ist nicht genug. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 53 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.5 Beachte die Qualität von DB2-SQL Abfragen Einen Anhaltspunkt für die Qualität einer Query kann schon das Wissen um die Art, wie DB2 Prädikate verarbeitet, liefern. Dazu muss man die Art und Weise kennen, mit welcher Gewichtung DB2 SQL-Prädikate verarbeitet: Schritt-1: Indexable Prädikate werden verarbeitet A. „matching predicates“ auf Index Spalten werden benutzt, wenn der Index zugegriffen wird 1. Alle „ist gleich“-Prädikate und IN-Listen mit einem einzigen Wert 2. Alle „range predicates“ und Spalten mit NOT NULL Definition 3. Alle anderen Prädikatstypen B. „Indexscreening“ wird eingeleitet 1. Alle „ist gleich“-Prädikate und IN-Listen mit einem einzigen Wert 2. Alle „range predicates“ und Spalten mit NOT NULL Definition 3. Alle anderen Prädikatstypen Schritt-2: Weitere Stage1 Datenprädikate werden als nächstes angewendet, erkannt nach dem Zugriff auf Datenpages 1. Alle „ist gleich“-Prädikate und IN-Listen mit einem einzigen Wert 2. Alle „range predicates“ und Spalten mit NOT NULL Definition 3. Alle anderen Prädikatstypen Schritt-3: Die Stage2 Prädikate werden auf die zurückgegebenen Daten„rows“ angewendet 1. Alle „ist gleich“-Prädikate und IN-Listen mit einem einzigen Wert 2. Alle „range predicates“ und Spalten mit NOT NULL Definition 3. Alle anderen Prädikatstypen Schritt-4: Alle restlichen Prädikate werden bestimmt und in der Reihenfolge in der sie in der Query stehen, bearbeitet. 4.4.1.6 Nutze „stage1“-Prädikate Der beste Garant für gute Performance ist die Nutzung von Stage1-Prädikaten. Die Tabelle aus dem DB2-Manual (siehe auch Pkt. 6.2.1 ff) zeigt „indexable“ Prädikate. Dies heißt jedoch nicht, dass solche Statements wirklich einen Index nutzen oder in Stage1 ablaufen – es müssen auch alle anderen Anforderungen an Stage1 Prädikate erfüllt sein. Als erstes wird die Syntax des Prädikates zur Entscheidung herangezogen, ob in Stage1 verarbeitet werden kann. Als zweites wirken Typ und Länge von Konstanten im Prädikat. Wann immer, obwohl als Stage1 Prädikat klassifiziert, ein solches Prädikat NACH einer Join Operation bearbeitet wird, wird es zu einem Stage2 Prädikat. Alle „indexable“ Prädikate sind Stage1, aber nicht alle Stage1 Prädikate sind „indexable“!! © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 54 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.7 Verwende nie generische SQL-Statements Generische SQL-Statements bedeuten jedenfalls, dass etwas geliefert wird, was nicht nötig ist. Meist wird SQL nur als „I/O Layer“ verwendet. Das folgende Beispiel stammt aus der Praxis: Modulname: GET_CUSTOMER(ws-acct-#, struktur ) Code: SELECT * INTO WHERE Programmcode: GET-CUSTOMER: CALL get_customer (kdnr, kd_satz) IF kd_code NOT = x THEN GO TO GET-CUSTOMER FROM kunde :struktur kd_nr = :ws-kd# Dieses Beispiel verletzt alle Regeln über die bisher bezüglich SQL Performance diskutiert wurde. Generisches SQL besitzt Logiken, die nur spezifische Daten oder Datenzusammenhänge darstellen und die „business-rule“ im Programm implementiert. Generisches SQL und generische I/O Layer gehören bei DB2 nicht zur Kategorie „hochperformante“ Systeme. 4.4.1.8 Vermeide unnötige SORT-Abläufe Die Forderung nach möglichst wenigen SORT-Vorgängen gilt für alle Anwendungen, ganz besonders für Systeme, für die höchste Performance erwartet wird. Wann immer SORTs unvermeidbar sind, sollten sie über passende Indizes unterstützt sein. Sortvorgänge werden bei DB2 durch folgende SQL-Anweisungen ausgelöst: • • • • • GROUP BY ORDER BY DISTINCT UNION Join Expressions Eine Sortierung für Joins ist ein klares Indiz dafür, dass ein passender Index für den JOIN-Vorgang fehlt. Wird ein SORT nach dem Join erforderlich, kann man nur hoffen, dass die Ergebnismenge möglichst klein ist. Das schlimmste Szenario ergibt sich aus einem SORT in einem Cursor von dem das Programm nur einen Teil der gelesenen Daten verarbeitet. In diesem Fall sollte der SORT-„overhead“ unbedingt verhindert werden. Es ist klar, dass, wenn im SQL 100 Sätze sortiert, aber nur 10 verarbeitet werden, dies keine Probleme bereitet, solange die Daten über gute Prädikate spezifiziert wurden. Und: Es gibt keine Regel, die sagt, wann „zu viele“ Daten sortiert werden, da dies ursächlich mit den Parametern des DB2-Subsystems zusammenhängt. Aber es gibt einen Punkt, an dem überlegt werden muss, ob Sort als externer Vorgang oder anders implementiert werden sollten. Die Antwort ist einfach: In Tests sollte mit dem gesamten erforderlichen Datenumfang gearbeitet werden, um eine möglichst gute Lösung zu finden. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 55 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.9 Sortiere nur die erforderlichen Spalten Wenn DB2 Daten sortiert, benötigt es die Spalten, nach denen sortiert werden soll, zweimal im SQL-Statement: Query-1: SELECT FROM WHERE AND ORDER BY nachname, ort, staat, bundesland, planet demograf_daten planet = :hplanet bundesland = :hbundesland planet, bundesland, staat, ort, nachname Bild-38: Sortieren mit SQL – Beispiel 1 Angenommen es gibt keinen Index auf dieser Tabelle, so kann man relativ schnell sehen, dass hier ein Problem existiert. Planet und ort sind bereits bekannt. Sind die fünf Spalten im ORDER BY indiziert, so würden diese beiden Spalten trotzdem nicht benötigt werden. Die Query könnte wie folgt neu formuliert werden: Query-2: SELECT FROM WHERE AND ORDER BY nachname, ort, staat demograf_daten planet = bundesland = staat, ort, nachname :hplanet :hbundesland Bild-39: Sortieren mit SQL – Beispiel 2 Der Vorteil hierbei ist die Eliminierung von unnötig zurückgegebenen Daten. In dieser Variante könnte es aber passieren, dass alle „nachname“-Felder aller Individuen innerhalb eines Bundeslandes sortiert werden. Betrachten wir die ursprüngliche Query (Query1), so kann man annehmen, dass, wenn ein Index für das Selektieren der Daten genutzt wird, kein SORT mehr erforderlich ist. Im Fall „Query1“ sind die Daten unmittelbar innerhalb eines Cursor verfügbar, im Fall „Query2“ müssen Query und SORT komplett sein, bevor die erste „row“ geliefert werden kann. Hier noch eine dritte Alternative (ab DB2V6): Query-3: SELECT FROM WHERE AND ORDER BY nachname, ort, staat demograf_daten planet = :hplanet bundesland = :hbundesland planet, bundesland, staat, ort, nachname Bild-39: Sortieren mit SQL – Beispiel 3 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 56 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index In diesem Fall könnte ein SORT vermieden werden, wenn ein Index über fünf Spalten zur Wiedergewinnung der Daten in der geforderten Reihenfolge genutzt wird. Es gäbe keinen „overhead“ für zwei zusätzlich gelesene Spalten, die an ein Programm übergeben würden. Aber was wenn die o.g. Lösungen nicht für eine Verarbeitung zur Verfügung stehen ? Es gibt noch weitere Aspekte, Queries zu untersuchen, wenn SORTs unerlässlich und zu viele Spalten betroffen sind. Hier ein Beispiel mit GROUP BY, das natürlich einen SORT-Vorgang anstößt. Man könnte hier „nested table expressions“ verwenden, um unnötige SORTs zu vermeiden. Query-4: SELECT FROM WHERE GROUP BY a.abtnr, a.abtname, a.ug_abtnr, count(*) abteilung a, mitarbeiter m m.abtnr = a.abtnr a.abtnr, a.abtname, a.ug_abtnr Bild-40: Sortieren mit SQL – Beispiel 4 Die Spalten „abtnr“ und „ug_abtnr“ seien eindeutig für jede Abteilung und somit müssen sie nicht im GROUP BY mitangegeben werden. In diesem Fall kann man über „nested table expression“ Zeit einsparen, indem man weniger Daten sortiert, oder über Indexzugriff gruppiert. Query-5: SELECT FROM WHERE a.abtnr, a.abtname, a.ug_abtnr, count_erg abteilung a ( SELECT m.abtnr AS cnt_abt COUNT(*) AS count_erg FROM mitarbeiter m GROUP BY m.abtnr ) AS temp a.abtnr = cnt_abt Bild-41: Sortieren mit SQL – Beispiel 5 Sollten Sorts in beiden Fällen erforderlich sein, so gibt es folgende Unterschiede: Query-4: a.abtnr, a.abtname und a.ug_abtnr sind „sort-key“ und a.abtnr, a.abtname, a.ug_abtnr und COUNT(*) stellen die Datenanforderung dar Query-5: m.abtnr ist „sort-key“ und m.abtnr und COUNT(*)stellen die Datenanforderung dar Die Chancen für Query-5 den SORT innerhalb des Sortpools bewerkstelligen zu können sind ungleich höher als für Query-4. Die Schlüsselfelder für einen SORT müssen nämlich in der Regel separat am Anfang der „row“, die sortiert werden soll, stehen, und damit werden sie zu groß für einen „incore“-SORT. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 57 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.10 Benutze die ON-Klausel für alle JOIN-Prädikate Grundsätzlich gibt es zwei Formate für „inner join“-Formulierungen. Ein Format ist der „natural join“ und die andere Möglichkeit ist die Formulierung über die ONBedingung. Es gibt keinen Grund mehr, die „natural join“-Form weiterhin zu benutzen, vor allem, da die INNER JOIN Ausdrücke neu und damit mit zusätzlichen Vorteilen seitens des DB2 ausgestattet sind. Das alleine reicht aber nicht aus, vielmehr ist die Dokumentationsfähigkeit bei der ON-Formulierung besser: Man kann nicht so leicht ein JOIN-Prädikat vergessen. Query-1: SELECT FROM WHERE AND bundesland, region, v.persnr, gesamt_ums vertrieb v Mitarbeiter m v.persnr = m.persnr v.bundesland = :hbundesland Query-2: SELECT FROM WHERE bundesland, region, v.persnr, gesamt_ums vertrieb v INNER JOIN mitarbeiter m ON v.persnr = m.persnr v.bundesland = :hbundesland Bild-42: ON-Klausel als JOIN-Prädikat – Beispiel In der zweiten Query wird man nur schwerlich ein JOIN-Prädikat vergessen. Die Verbesserungen der ON-Klausel in DB2V6 waren umfangreich und viele davon betrafen direkt die Performance. Die Filterung erfolgt direkt beim JOIN-Prozess, nicht vorher und nicht nachher. Alle Prädikate können auch in der ON-Klausel angegeben werden. Ausnahme: „subqueries“ 4.4.1.11 Vermeide UNIONs UNION-Verarbeitung ist teuer, insbesondere, wenn jeder UNION-Block dieselbe Tabelle verarbeitet. Zusätzlich werden die meisten UNION ohne ALL geschrieben, was DB2 dazu veranlasst, mehrfach vorkommende Zeilen aus dem Ergebnis auszuschließen (wie bei DISTINCT) obwohl eventuell gar keine Dubletten existieren. Wie auch immer: UNION ohne ALL kann SORT-Vorgänge erforderlich machen (siehe Pkt. 4.4.1.8 ff). Outer Join Formulierungen lassen die meisten UNIONFormulierungen überflüssig werden. Zusätzlich dazu können viele UNION-Angaben durch die Einführung von CASEExpressions ersetzt werden. UNION-Formulierungen stellen für den Optimizer eine schwierige Semantik dar. Sie kann nur selten gut optimiert bzw. automatisch umformuliert werden. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 58 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Beispiel (eine Query mit 4 UNION-Blöcken): Query-1: SELECT FROM WHERE AND GROUP BY se.typ, cj.code, cj.gruppe, cj.tdatum, dm.klasse, sum(cj.menge), 0, 0, 0 cj INNER JOIN se ON cj.typ = se.typ INNER JOIN dm ON cj.klasse = dm.klasse INNER JOIN tc ON cj.code = tc.code tc.basis_code = ‘I’ cj.tdatum = ( SELECT MAX( cj2.tdatum) FROM cj AS cj2 WHERE <correlated predicates> ) se.typ, cj.code, cj,gruppe, cj.tdatum, dm.klasse UNION ALL SELECT FROM WHERE AND GROUP BY se.typ, cj.code, cj.gruppe, cj.tdatum, dm.klasse, 0, sum(cj.menge), 0, 0 cj INNER JOIN se ON cj.typ = se.typ INNER JOIN dm ON cj.klasse = dm.klasse INNER JOIN tc ON cj.code = tc.code tc.basis_code = ‘DE’ cj.tdatum = ( SELECT MAX( cj2.tdatum) FROM cj AS cj2 WHERE <correlated predicates> ) se.typ, cj.code, cj,gruppe, cj.tdatum, dm.klasse UNION ALL SELECT FROM WHERE AND GROUP BY se.typ, cj.code, cj.gruppe, cj.tdatum, dm.klasse, 0, 0, sum(cj.menge), 0 cj INNER JOIN se ON cj.typ = se.typ INNER JOIN dm ON cj.klasse = dm.klasse INNER JOIN tc ON cj.code = tc.code tc.sec_code = ‘I’ cj.tdatum = ( SELECT MAX( cj2.tdatum) FROM cj AS cj2 WHERE <correlated predicates> ) se.typ, cj.code, cj,gruppe, cj.tdatum, dm.klasse UNION ALL SELECT FROM WHERE AND GROUP BY ORDER BY © S.K. Consulting Services se.typ, cj.code, cj.gruppe, cj.tdatum, dm.klasse, 0, 0, 0, sum(cj.menge) cj INNER JOIN se ON cj.typ = se.typ INNER JOIN dm ON cj.klasse = dm.klasse INNER JOIN tc ON cj.code = tc.code tc.sec_code = ‘DE’ cj.tdatum = ( SELECT MAX( cj2.tdatum) FROM cj AS cj2 WHERE <correlated predicates> ) se.typ, cj.code, cj,gruppe, cj.tdatum, dm.klasse 2, 3, 4 ++49 8106 994390 www.sk-consulting.de Seite 59 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Eine Lösung kann es über die Verwendung von CASE-Expressions geben: Lösung: SELECT , , , , FROM WHERE AND GROUP BY ORDER BY se.typ, cj.code, cj.gruppe, cj.tdatum, dm.klasse SUM (CASE WHEN tc.basis_code = ‘I’ THEN cj.menge END) SUM (CASE WHEN tc.basis_code = ‘DE’ THEN cj.menge END) SUM (CASE WHEN tc.sec_code = ‘I’ THEN cj.menge END) SUM (CASE WHEN tc.sec_code = ‘I’ THEN cj.menge END) cj INNER JOIN se ON cj.typ = se.typ INNER JOIN dm ON cj.klasse = dm.klasse INNER JOIN tc ON cj.code = tc.code ( tc.basis_code IN ( ‘I’, ‘DE’ ) OR tc.sec_code IN ( ‘I’, ‘DE’ )) cj.tdatum = ( SELECT MAX( cj2.tdatum) FROM cj AS cj2 WHERE <correlated predicates> ) se.typ, cj.code, cj,gruppe, cj.tdatum, dm.klasse 2, 3, 4 Bild-43a: CASE und INNER JOIN anstatt UNION – Beispiel Ein UNION mit NOT EXISTS kann auch als Alternative mit einem OUTER JOIN substituiert werden: SELECT a.abt_nr , a.abt_name , m.nachname FROM v_mitarbeiter M , v_abteilung A WHERE a.abt_ltnr = m.pers_nr UNION ALL SELECT a.abt_nr , a.abt_name , '** UNBEKANNT **' FROM v_abteilung A WHERE NOT EXISTS ( SELECT * FROM v_mitarbeiter X WHERE x.pers_nr = a.abt_ltnr ) ORDER BY 2; ----------------------------------------------- ist identisch mit…. ----------------------------------------------SELECT a.abt_nr , a.abt_name , VALUE(m.nachname,'** UNBEKANNT **') FROM v_abteilung A LEFT OUTER JOIN v_mitarbeiter M ON a.abt_ltnr = m.pers_nr ORDER BY 2; Bild-43b: OUTER JOIN anstatt UNION mit EXISTS – Beispiel © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 60 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.12 Nutze JOINs anstatt „subqueries“ Diese Aussage gilt seit den Anfängen von DB2: Joins übertreffen „subqueries“ in Hinsicht auf die Performance beinahe in jedweder Konstellation. Dabei ist das WARUM relativ einfach zu verstehen und auch, wie der Ablauf erfolgt. Es gibt im JOIN immer mehrere Alternativen bei der Wahl des Zugriffspfads und DB2 kann auch zwei und mehr Tabellen simultan bearbeiten. Aber warum findet man dann so viele „subqueries“ anstelle von Joins in Applikationen? Joins werden gemeinhin vermieden, weil es Gerüchte über die schlechte Performance von Joins oder sogenannte „inhouse“-Standards gibt, die Joins „verbieten“. Zunächst gibt es zwei Formen von „subqueries“: „correlated“ und „non-correlated“ Subqueries. Query-1(„non-correlated“): SELECT ta.col1, ta.col2 FROM ta WHERE NOT EXISTS ( SELECT 1 WHERE FROM tb tb.col1 = :hv1 ) Query-2(„correlated“): SELECT ta.col1, ta.col2 FROM ta WHERE ta.col3 = ‘ABC’ AND NOT EXISTS ( SELECT 1 WHERE FROM tb tb.col2 = ta.col2 ) Bild-44: „correlated“ und „non-correlated“ Subqueries – Beispiel Es gibt allerdings auch Situationen, in denen eine “correlated” Subquery bessere Performance aufweist als ein Join. Dies ist begründet in der in DB2 implementierten „lookaside“ Technik für „caching“. Der Cache behält das Ergebnis einer „subquery“ und wenn dieselben Werte erneut an die „subquery“ gegeben werden sollen, können die gleichen korrekten Werte aus dem Cache verwendet werden. Grundsätzlich sollte schon aus Performance-Gründen ein Join kodiert werden. Es ist zwar nicht offensichtlich, aber auch NOT EXISTS und NOT IN können als Joins formuliert werden. Manchmal konvertiert DB2 „non-correlated“ IN-Subqueries in einen Join, doch vor der DB2 Version 6 führte das nicht unbedingt zu besseren Ergebnissen in der Performance. Normalerweise leiten ein EXISTS mit „correlated“ Subquery und IN Prädikate mit „non-correlated“ Subqueries eine Stage2 Verarbeitung ein. Werden solche Queries in Joins konvertiert, so kann die „inner table“ die Prädikate auf Stage1 verarbeiten. Die Regel hierzu ist einfach: Ein Join ist einer Subquery - in der Regel - immer vorzuziehen © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 61 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.13 Komplemetärmengen bei „outer joins“ Häufig wird bei der Verwendung von „outer joins“ nicht nach der „outer join“ Menge, sondern nach der echten Komplementärmenge gesucht. Bis heute wurde eine derartige Anfrage mit „NOT EXISTS“ – Formulierungen getätigt, wie das folhende Beispiel zeigt: EXPLAIN PLAN SET QUERYNO = 646110 FOR SELECT DISTINCT A.TESNR ,A.PARTNR ,A.UKZEMPF ,A.FILEMPF ,B.AONR FROM Tabelle1 A, Tabelle2 B WHERE A.DATWE = '1900-01-01' AND NOT EXISTS (SELECT 1 FROM Tabelle3 C WHERE C.TESNR = A.TESNR AND C.UKZ = :WEQUIT.UKZ AND C.FIL = :WEQUIT.FIL) AND A.ABRUFNR = B.ABRUFNR AND A.ABRUFPOS = B.ABRUFPOS AND A.UKZEMPF = B.UKZEMPF AND A.FILEMPF = B.FILEMPF AND A.PARTNR = B.PARTNR AND B.ABTEMPF = :VAPOS.ABTEMPF AND A.UKZEMPF = :VAWAPO.UKZEMPF AND A.FILEMPF = :VAWAPO.FILEMPF AND A.DATWA BETWEEN :U-WADATUM-VON AND :U-WADATUM-BIS WITH UR Bild-44a: „outer join“ und Komplementärmenge (mit NOT EXISTS) – Beispiel Einfacher und effizienter kann man diese Query aber über die direkte Formulierung der Komplementärmenge laufen lassen: EXPLAIN PLAN SET QUERYNO = 646113 FOR SELECT DISTINCT A.TESNR ,A.PARTNR -,A.UKZEMPF -- IST DAS NOETIG ?? -,A.FILEMPF -- SIEHE WHERE KLAUSEL ,B.AONR FROM DB.Tabelle1 A INNER JOIN DB.Tabelle2 B ON A.ABRUFNR = B.ABRUFNR AND A.ABRUFPOS = B.ABRUFPOS AND A.UKZEMPF = B.UKZEMPF AND A.FILEMPF = B.FILEMPF AND A.PARTNR = B.PARTNR LEFT OUTER JOIN DB.Tabelle3 C ON NOT ( C.TESNR = A.TESNR AND C.UKZ = ? --:WEQUIT.UKZ AND C.FIL = ? ) --:WEQUIT.FIL WHERE A.DATWE = '1900-01-01' ..... WITH UR Bild-44b: „outer join“ und Komplementärmenge (ohne NOT EXISTS) – Beispiel Dabei ist es wichtig darauf zu achten, "leere Mengen" und "NULLS" dennoch addressieren zu können! © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 62 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Dies dokumentiert die DSN_STATEMNT_TABLE in DB2: QUERY NO -------646110 646113 PROGNAME -------DSQBESQL DSQBESQL GROUP MEMBR ----- CST EXPLAIN TIME ---------2005-11-28 2005-11-28 STMT TYPE ---SELE SELE CAT GRY --B B PROC MS ----39 5 PROC SU ----277 30 REASON ----------HOST VARIAB HOST VARIAB Aber nicht vergessen: Alles das ist eine Option, die davon ausgeht, dass die Queries über passende Indizes und aktuelle Statistiken optimal unterstützt werden! 4.4.1.14 Kodiere die selektivsten Prädikate zuerst Oft hört man, sich um die Statement-Reihenfolgen in den Prädikaten zu kümmern sei Zeit- und Geldvergeudung. Das ist nicht richtig. In vielen SQL Statements werden Prädikate auf dieselbe Verarbeitungsebene definiert. Die Verarbeitung aber erfolgt von oben nach unten. Je eher ein Prädikat verarbeitet werden kann, desto effizienter ist es. So sind Stage1 Prädikate besser als Stage2 Verarbeitung, da sie früher erkannt und bearbeitet werden können. Alle SQL Queries sollten so kodiert sein, dass die am meisten restriktiven Prädikate zuerst erkannt werden können. Damit verringern sich die Verarbeitungskosten für spätere Verarbeitungsschritte. Dies gilt insbesonders für die Nutzung von „dynamic SQL“ in JAVA, VBA, VBA.NET usw., die in Programmen dynamische Strings erzeugen, in denen sich „native“ SQL befindet. Das „dynamic cache“ „feature“ von DB2 kann in solchen Fällen sehr hilfreich sein, da damit mehrfache „prepares“ für dasselbe, häufig genutzte SQL – Statement vermieden werden kann. Dazu müssen aber die dynamischen SQL-Statements Parameter Marker („?“) verwenden und nicht die Hostvariablen direkt . Public static void main() { Connection con = DriverManager.getConnection() PreparedStatement stmt = null; stmt = con.prepareStatement („SELECT name FROM person WHERE id = 25“); ResultSet rs = stmt.executeQuery(); rs.print(); } Try { Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance(); Connection con = DriverManager.getConnection(“jdbc:db2:db “); PreparedStatement stmt = null; stmt = con.prepareStatement (“SELECT name FROM person WHERE id = ?“); stmt.setInt (1, 25); ResultSet rs = stmt.executeQuery(); while (rs.next()) { System.out.println (rs.getString(1)); } Catch (SQLExeption se){ System.out.println(“Error:“ + se)} Bild-44c: „JDBC“ und Parameter Marker – Beispiel © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 63 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.15 Nutze erprobte Methoden zur Existenzprüfung(EXISTS) Hierzu gibt es eine Reihe von Untersuchungen, u.a von M. Hannan (Australien). Es gibt diverse Lösungen zu diesem Problem und man muss genau hinsehen, um die richtige Methode zu wählen. In vielen Fällen ist die folgende Formulierung die beste, vorausgesetzt, dass KEYCOL die erste Spalte in einem der Indizes auf der Tabelle TAB darstellt: Query-Beispiel-1(im Programm): SELECT FROM WHERE ‘1’ INTO tab tab.scol01 :hostvar1 = :hostvar2 IF sqlcode = 0 OR sqlcode = -811 then Existenzpruefung positiv IF sqlcode = +100 then Existenzpruefung negativ Bild-45: Existenzprüfung im Programm – Beispiel-1 Unsicher wäre ein Test auf die Hostvariable :hostvar1, da bei einem SQLCODE – 811 die Inhalte der Hostvariablen nicht vorhersagbar wären. Dies gilt für alle negativen SQLCODEs! Ist als Zugriffspfadverarbeitung „list prefetch“ bestimmt, hat man das Problem, dass der „list prefetch“ erst beendet sein muss, bevor man ein Resultat erhält. Dies ist nicht nur schlecht für die Antwortzeiten, sondern auch belastend für die DB2-Ressourcen. Was aber ist im Falle eines „sequential prefetch“? - Der „sequential prefetch“ besteht aus einer Menge von I/O-Operationen, deren erster Schritt synchron abläuft und der die Antworten unmittelbar an die einzelne SQL-Query zurückgibt. Das Problem wäre ein ein TS-Scan, der nur zur Existenzprüfung diente. Das wiederum hängt davon ab wessen Existenz geprüft wird. Sucht SQL in einer kleinen „Code“Tabelle, mit 100 „rows“ pro DB2 Page, dann ist ein „sequential prefetch“ durchaus in Ordnung, wenn kein Index zur Verfügung steht. Hierfür generelle Regeln aufzustellen ist schwer, da sich die Fälle sehr unterschiedlich darstellen können. Dennoch: Folgende DB2-Aktionen sollten nicht zur Existenzprüfung genutzt werden: • • • • • • „Sequential prefetch“ „Dynamic prefetch“ „List prefetch“, jede Art von Materialisierung Jede Art von SORTs „Hybrid“ und/oder „merge/scan“ Joins Diese Funktionen erzeugen nachweislich einen zu großen „overhead“ ... Es gibt einen anderen Weg, Existenzprüfungen effizienter zu gestalten, falls kein adäquater Zugriffspfad ausgewiesen wurde: Man schreibe die Query als Cursor und nutze die Anweisung OPTIMIZE FOR 1 ROW, idealerweise mit UR als Isolation Level. Das funktioniert auf jeden Fall, benötigt aber drei Calls auf das DB2 und das bedeutet extra durchlaufenen Code, der aus Performance-Gründen vermieden werden sollte. Eine weitere Query-Formulierung wird oft empfohlen, ist aber nur in wenigen Fällen wirklich nützlich: © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 64 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Query-Beispiel-2: SELECT ‘1’ INTO :hostvar1 FROM sysibm.sysdummy1 a WHERE EXISTS ( SELECT ‘1’ FROM tab WHERE a.ibmreqg >= ‘ ‘ AND <filter/matching prädikate> ) Bild-46: Existenzprüfung im Programm – Beispiel 2 Diese Query-Formulierung wird von einem „single“ SQL Statement normalerweise übertroffen. Also kann die Regel nur lauten: Man nutze „single“ SQL zur Existenzprüfung. Es ist jedoch sicherzustellen, dass keine Zugriffsprobleme auftreten können. Aber auch das Beispiel-2 ist nicht unbedingt zu empfehlen und es gibt Fälle, in denen die Lösung mit der Cursor-Formulierung und der OPTIMIZE-.Klausel das „single“ SELECT nicht übertreffen kann, weil „nonmatching index scans“ zu lang sind. Eine weitere Empfehlung lautet also: Der Prozess sollte nicht für ein und dieselbe Prüfung wiederholt werden müssen. Beispiel: Ein Batch-Prozess mit im Programm implementierter RI kann durchaus verkürzt werden, vor allem, wenn es sich nicht um den normalen, großen INSERT in eine „child-table“ einer einzelnen „parent-table“ handelt. In diesem Fall schicken mehrere Queues Daten an den INSERT-Prozess, der eine einzige Existenzprüfung durchführt. Wenn also wiederholt gleiche Objekte von den Queues kommen, wird ein unnötiger „existence check“ mehrfach durchgeführt. Die Lösung ist einfach: Ein separater „existence check“ wird für jede Queue durchgeführt, um zu sehen, ob der nächste Eintrag auf der Queue dieselbe „parent row“ hat wie der aktuelle. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 65 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.1.16 Subqueries sind zu „tunen“ Obgleich es keine allgemeinen Regeln für die Entscheidung gibt, ob und wie Subqueries einzusetzen sind, hier eine generelle Hilfestellung: Wenn möglich, ist es besser einen Join als eine Subquery nutzen, da eine Subquery die Reihenfolge, in der auf Tables zugegriffen wird, streng festlegt. Mit einem Join wählt DB2 die jeweils bessere TableZugriffsreihenfolge. Wenn wirksame Indexes auf Tables in einer Subquery zur Verfügung stehen, ist eine Correlated Subquery die wirksamste Art einer möglichen Subquery. Wenn keine passenden Indexes auf Tables in der Subquery vorhanden sind, dürfte eine Non-Correlated Subquery der wirksamste Zugriff sein. Wenn in einer Query mehrere Subqueries vorkommen, stellt man sicher, dass die Subqueries in einer sinnvollen Reihenfolge angelegt sind. Betrachten wir folgende Query auf die Tabelle MY_TABLE: SELECT FROM WHERE AND * MY_TABLE TYPE PARTS IN (subquery 1) IN (subquery 2); Bild-47: Tuning von Subqueries – Beispiel Unter der Voraussetzung, dass Subquery 1 und Subquery 2 vom selben Typ von Subquery (correlated bzw. non-correlated) sind, wird DB2 die Subqueryprädikate in der Reihenfolge auflösen, in der Sie in der WHERE-Bedingung angelegt sind. Annahme: Subquery 1 schließt 10% aller Rows aus, Subquery 2 schließt 80% aller Rows aus. Und: Das Prädikat in Subquery 1 (P1) wird 1000 mal ausgeführt, und das Prädikat in Subquery 2 (P2) wird im Anschluss daran 900 mal ausgeführt, was eine Summe von 1900 Prädikat-Prüfungen ergibt. Wenn man die Reihenfolge der Subqueries verändert, wird P2 zwar ebenfalls 1000 mal ausgeführt, jedoch nur noch mit 20% der Daten aus der Gesamtmenge, was sich in lediglich 200 Prüfungen in P1 niederschlägt. Die Anzahl der Prädikat-Prüfungen sinkt somit auf 1200. Es scheint also die Reihenfolge P2 und dann P1 günstiger als die Reihenfolge P1 und dann P2 - unter der Voraussetzung, dass der Zeitaufwand je Prädikat gleichartig ist. Ist der Zeitaufwand der Prädikate sehr unterschiedlich, müssen die Alternativen im Einzelnen geprüft werden. Wenn man sich nicht sicher ist, muss man die Funktion EXPLAIN auf die Query und auf beide Variationen mit Correlated und einer Non-Correlated Subquery anwenden. Nach Prüfung des EXPLAIN-Ergebnisses erfolgt die Untersuchung der vorliegenden Struktur der Daten und damit sollte man in der Lage sein, das günstigste Statement zu bestimmen. Dieses Vorgehen kann für alle Typen von Prädikaten angewandt werden, da Subquery Prädikate über das Potential verfügen, ein Vielfaches von Prozessor- und I/O-Zeit gegenüber anderen Prädikatsformulierungen zu verschlingen. Man prüft deshalb immer die Reihenfolge der Subqueries in einem SQL-Statement. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 66 von 127 DB2-Optimierung und SQL-Performance Aber Achtung: Kapitel 11: Anhang – Index DB2 führt alle Non-Correlated Subquery-Prädikate vor den Correlated Subquery-Prädikaten aus, unabhängig von deren Reihenfolge in der Query. Zum Tuning von Subqueries gibt es zusammenfassend folgende Empfehlungen: 1. Vergleich der Subquery-Aufwände mit einer gleichwertigen JOIN-Lösung 2. Reduktion des "subquery-nestings". Die Subqueries werden in der Reihenfolge ihrer Definition ausgeführt. Ggf. muss hierfür die Reihenfolge geändert werden falls logisch möglich 3. anstatt einer "non-correlated" Subquery sollte womöglich eine "correlated" Subquery 4. verwendet werden 5. Die Effizienz-Reihenfolge bei Subqueries lautet wie folgt: a) b) c) Correlated Subquery mit effizientem Index "non-correlated" Subquery Correlated Subquery ohne Index Bild-48: Tuning von Subqueries – Zusammenfassung 4.4.1.17 Vermeide alles, was nicht unbedingt notwendig ist So lautet die letzte Regel für Performance; d.h. man sollte nicht große Datenmengen von DB2 lesen, wenn man nur 10 Zeilen für das Ergebnis braucht. Oft sind dies Dinge, die man nur durch „tracing“ bemerken kann. Aber man bedenke: „Overhead“ stiehlt anderen Usern/Tasks die Ressourcen und die Beseitigung solcher „Ressourcenvernichter“ kann zu erhöhtem Transaktionsdurchsatz insgesamt führen. Cursor in Online-Programmen sollten immer eine Klausel OPTIMIZE FOR 10 ROWS haben. Anmerkung: Ein „List prefetch“ wird oft als schlecht eingestuft. Er kann aber sowohl gut als auch schlecht sein, wie jedes beliebige andere „feature“. In OLTP-Umgebungen ist ein „list prefetch“ meist von Vorteil. Die Aussage ist stark vom Datenumfang und der Art der Datennutzung abhängig. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 67 von 127 DB2-Optimierung und SQL-Performance 4.4.2 Kapitel 11: Anhang – Index Modifikation von SQL-Statements Eine Modifikation von SQL-Statements im Sinne einer verbesserten Performance und Verarbeitungsfähigkeit können das DB2 selbst oder der User vornehmen. Nicht berücksichtigt ist im Folgenden die Fähigkeit von DB2 Version 8 „automatic query rewriting(AQR)“ über den Einsatz von MQT’s („materialized query tables“) zu betreiben. 4.4.2.1 Häufigste Modifikationen durch das DB2 Seit einigen Versionen modifiziert DB2 selbst bestimmte SQL-Formulierungen im Sinne seines Optimizers. So werden vom DB2 folgende Aktionen angestossen: • IN-Listen mit einer Ausprägung zum „=“ Prädikat Beispiel: WHERE kto_nr IN (12345) wird zu WHERE kto_nr = 12345 • OR-Prädikate, die sich auf dieselbe Spalte beziehen werden in eine IN-Liste umgewandelt Beispiel: WHERE kto_nr = 123 OR kto_nr = 345 OR kto_nr = 567 wird zu WHERE kto_nr IN ( 123, 345, 567 ) 4.4.2.2 Modifikationen über zusätzliche Prädikate („transitive closure“) Das Einfügen weiterer Filterkriterien(nur bei <equal>, <not equal> und „ranges“ (inklusive BETWEEN, nicht bei LIKE und IN...) ist eine weitere Methode, Queries zu verändern: • JOIN-Prädikat Beispiel: WHERE AND AND • Lokale Prädikate Beispiel: WHERE AND AND • a.projekt# = b.projekt# a.projekt# BETWEEN 100 AND 200 b.projekt# BETWEEN 100 AND 200 neuer_preis neuer_preis alter_preis = > > alter_preis 8000 8000 ON-Prädikate(„outer join“) Beispiel: ON AND AND a.projekt# = b.projekt# a.projekt# BETWEEN 100 AND 200 b.projekt# BETWEEN 100 AND 200 Einfügungen werden immer generiert (auch wenn bereits manuell eingefügt) falls die u.a. Bedingungen gegeben sind: 1. Es liegt ein <equal>-Prädikat vor 2. Ein anderes Prädikat filtert eine dieser „columns“ weiter aus (nur bei <equal> und <range> Prädikaten) © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 68 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.2.3 Vereinfachung der JOIN-Verarbeitung DB2 generiert eigenständig JOIN-Operationen um, wenn dies zu einem korrekten Ergebnis führt. So wird aus einem FULL OUTER JOIN ein LEFT OUTER JOIN generiert LEFT oder RIGHT OUTER JOIN kann ein INNER JOIN werden Dies kann natürlich nur unter bestimmten Bedingungen geschehen und so muss DB2 aus bestimmten Klauseln erkennen, ob ein Umformulieren von SQL-Statements möglich ist oder nicht. Erkennen aufgrund der WHERE-Klausel Für Queries, in denen eine einfachere Join-Logik korrekt ist: bei „boolean terms“ Ergebnis der Prädikat-Analyse ist „false“, wenn NULL resultiert Beispiel: SELECT ..... FROM t1 FULL OUTER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c5 BETWEEN 4 AND 5 SELECT ......... FROM t1 LEFT OUTER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c5 BETWEEN 4 AND 5 Beispiel: SELECT ..... FROM t1 RIGHT OUTER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c5 BETWEEN 4 AND 5 SELECT ......... FROM t1 INNER JOIN t2 ON t1.c1 = t2.c1 WHERE t1.c5 BETWEEN 4 AND 5 Erkennen aufgrund der ON-Klausel 4.4.2.4 Beeinflussung der Reihenfolgen bei OUTER-JOINs Die JOIN-Operationen werden von DB2 in ihrer Reihenfolge umgeneriert (schon seit DB2 Version 3.1). 4.4.2.5 Subquery-Transformation in JOINs Eine Subquery kann ohne Verlust der geltenden Logik unter bestimmten Bedingungen in einen JOIN umformuliert werden 1. Wenn sie mit IN, = ANY, = SOME aktiviert wird Beispiel: SELECT ..... FROM projekt WHERE projekt_typ IN ( SELECT projekt_typ FROM projekt_typen_tab WHERE labor_ort IN ( ’München’, ’Frankfurt’ ) AND projekt_typ = ’ENTW’ ) SELECT ..... FROM projekt p, projekt_typen_tab pt WHERE p.projekt_typ = pt.projekt_typ AND pt.labor_ort IN ( ’München’, ’Frankfurt’ ) AND projekt_typ = ’ENTW’ © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 69 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 2. Wenn eine non-correlated subquery mit NOT, IN oder mit <> ALL vorgegeben ist, kann unter bestimmten Bedingungen ein NOT EXISTS mit „correlated subquery“ formuliert werden. Die Bedingungen sind: − Die ersetzbare „non-correlated subquery“ macht keinen „matching index scan“ − Die Spalte, auf die in der subquery referenziert wird, muss mit einem „matching index scan“ unterstützbar sein − Die Cardinality muss hoch sein und es dürfen keine lokalen Prädikate auf der Spalte existieren − Die Formate der Outer Query und der Subquery müssen übereinstimmen und mit NOT NULL definiert sein − Die subquery darf keine GROUP BY, DISTINCT oder „column functions“ enthalten − Das SQL-Statement führt keine Datenmanipulation aus (INSERT, UPDATE, DELETE) 4.4.2.6 Auswahl der „outer table“ bei JOINs Die Tabelle, auf die in einem JOIN mit einem UNIQUE Index zugegriffen wird, wird zur „outer table“ in der internen („cursor“-gesteuerten) JOIN-Verarbeitung von DB2. Dabei stellt sich das Problem eines programmtechnischen „loop“. Logisch ergibt sich in den Konstellationen „t1 als outer table“ oder „t2 als outer table“ kein Unterschied. Technisch aber erfolgt immer ein OPEN CURSOR auf die jeweilige Tabelle, deren Zeilen abgearbeitet sind. So kann man folgende Rechnung aufmachen: 1. Besteht die „outer table“ aus 1000 Zeilen und die „inner table“ aus 100 Zeilen, ergeben sich 1000 OPEN CURSOR t_outer_cursor, um alle Zeilen der „inner table“ wieder positionieren und mit der nächsten Zeile der „outer table“ vergleichen zu können. 2. Besteht die „outer table“ aus 100 Zeilen und die „inner table“ aus 1000 Zeilen, ergeben sich 100 OPEN CURSOR t_outer_cursor, um alle Zeilen der „inner table“ wieder positionieren und mit der nächsten Zeile der „outer table“ vergleichen zu können. Ein OPEN CURSOR aber ist eine aufwändige und zeitintensive Operation für DB2. Also wird DB2 beim „optimizing“ die Tabelle, von der das kleinste Resultat an Anzahl Zeilen zu erwarten ist als „outer table“ verwenden. Beispiel: SELECT FROM , WHERE AND ..... projekt p projekt_typen_tab pt p.projekt_typ = pt.projekt_typ p.projekt_nr = ’AD2100’ (PK) d.h. „outer table“ ist projekt p Was aber geschieht, wenn für den Optimizer kein eindeutiges Entscheidungskriterium erkennbar ist? – Dann ist der User - respektive die Formulierung der SQLQuery – gefragt (siehe auch Pkt. 3.2.15, 4.4.2.9 u.a.). © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 70 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.2.7 Ausschalten von Indizes Gibt es mehr als einen Index und das DB-System entscheidet sich für den ungünstigsten, kann die IX-Nutzung durch Umsetzen von Stage-1 auf Stage-2 Prädikate ausgeschaltet und so die Wahl des günstigeren IX forciert werden. Beispiel: SELECT FROM , WHERE AND AND p.projekt#, p.stermin, p.projekttyp projekt p projekttyp t p.projekttyp = t.projekttyp p.stermin > ’1.1.2002’ ← p.durchfuehrungsort = ’München’ ← IX günstig IX ungünstig (wird aber angenommenerweise vom DB2 gewählt) IX wird ausgeschaltet: SELECT FROM , WHERE AND AND p.projekt#, p.stermin, p.projekttyp projekt p projekttyp t p.projekttyp = t.projekttyp p.stermin > ’1.1.2002’ ( p.durchfuehrungsort = ’München’ OR 0 = 1 ) ← IX günstig aktiv (!) ← IX ungünstig wird abgeklemmt Bild-49: Ausschalten von Indizes Dieses Verfahren kann für alle Datentypen ohne weitere Nachteile angewandt werden. Die Ergebnismenge wird in keinem Fall beeinflusst. Alternativen sind: − Bei numerischen Werten: Addition/Subtraktion von 0 +0 / -0 Multiplikation/Division mit 1 − Bei alphanumerischen Spalten CONCAT mit Leerstring bzw. || ’ ’ − Generell © S.K. Consulting Services anstelle OR 0 = 1 kann auch OR 0 <> 0 stehen (mit dem Vorteil eines höheren Filterfaktors !!!) ++49 8106 994390 www.sk-consulting.de Seite 71 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.2.8 Beeinflussen der IX-Nutzung Durch die Vorgabe OPTIMIZE FOR 1 ROW kann sich die Nutzung von Indexen verändern. Beispiel: SELECT p.projekt#, p.stermin, p.projekttyp, p.name FROM projekt p, projekttyp t WHERE p.projekttyp = t.projekttyp AND p.stermin > ’1.1.2002’ AND p.durchfuehrungsort = ’München’ OPTIMIZE FOR 1 ROW Bild-50: OPTIMIZE-Klausel - Beispiel Durch Änderung von Korrelationsnamen im SELECT kann ein Index für die ORDER BY Anforderung genutzt werden Beispiel: SELECT FROM WHERE AND AND ORDER BY p.projekt#, p.stermin, T.projekttyp, p.name projekt p, projekttyp t p.projekttyp = t.projekttyp p.stermin > ’1.1.2002’ p.durchfuehrungsort = ’München’ projekttyp, name Bild-51: Indexnutzung beim ORDER BY – Beispiel 4.4.2.9 Beeinflussen von „outer table“ Auswahl und JOIN-Methode Über die Verwendung weiterer lokaler Prädikate kann ein JOIN-Prozess möglicherweise günstiger gestaltet werden. Grundregel: Je mehr Prädikate sich auf eine Tabelle beziehen, desto eher wird sie als „outer table“ favorisiert. Beispiel: SELECT FROM , WHERE AND AND AND p.projekt#, p.stermin, t.projekttyp, p.name projekt p projekttyp t p.projekttyp = t.projekttyp p.stermin > ’1.1.2002’ p.durchfuehrungsort = ’München’ t.maxdauer = t.maxdauer ggf. könnten noch weitere Einfügungen vorgenommen werden (Achtung: nur für NOT NULL-Spalten) Bild-52: Beeinflussen der OUTER-Table Auswahl – Beispiel 1 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 72 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Durch die Vorgabe OPTIMIZE FOR 1 ROW können sich „outer table“ und JOINMethode verändern. Wird ORDER BY vorgegeben, so wird der IX favorisiert, der die SORT-Anforderung erfüllt. Damit wird auch die zugrundeliegende Tabelle zur „outer table“ Beispiel: SELECT p.projekt#, p.stermin, p.projekttyp, p.name FROM projekt p , projekttyp t WHERE p.projekttyp = t.projekttyp AND p.stermin > ’1.1.2002’ AND p.durchfuehrungsort = ’München’ OPTIMIZE FOR 1 ROW Bild-53: Beeinflussen der OUTER-Table Auswahl – Beispiel 2 Durch Änderung von Korrelationsnamen in der SELECT- bzw. WHERE-Klausel können sich „outer table“ und JOIN-Methode verändern. Beispiel: SELECT FROM , WHERE AND AND p.projekt#, p.stermin, t.projekttyp, p.name projekt p projekttyp t p.projekttyp = t.projekttyp p.stermin > ’1.1.2002’ p.durchfuehrungsort = ’München’ Bild-54: Beeinflussen der OUTER-Table Auswahl – Beispiel 3 Beispiel: SELECT FROM , WHERE AND AND AND p.projekt#, p.stermin, p.projekttyp, p.name projekt p projekttyp t p.projekttyp = t.projekttyp p.stermin > ’1.1.2002’ p.durchfuehrungsort = ’München’ t.projekttyp = ‘ENTW’ anstatt p.projekttyp = ... Bild-55: Beeinflussen der OUTER-Table Auswahl – Beispiel 4 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 73 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Der Optimizer generiert bei LIKE- und IN-Prädikaten keine redundanten Prädikate. Daher sollten bei JOINs Redundanzen ins Statement aufgenommen werden. Beispiel: SELECT FROM , WHERE AND AND p.projekt#, p.stermin, p.projekttyp, p.name projekt p projekttyp t p.projekttyp = t.projekttyp p.projekttyp LIKE ‘ENT%’ t.projekttyp LIKE ‘ENT%’ von der IBM empfohlen.... Bild-56: Beeinflussen der OUTER-Table Auswahl – Beispiel 5 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 74 von 127 DB2-Optimierung und SQL-Performance 4.4.3 Kapitel 11: Anhang – Index Restrukturierung von UNION- durch CASE-Ausdrücke Zum einen sind UNION's für das SQL aufwendige Operationen ("Vereinigungsmengen"), zum anderen verursachen sie beim Weglassen der ALLKlausel SORT-Vorgänge für die einzelnen Untermengen - wegen der Option "distinct", die im UNION impliziert ist. UNION-Ausdrücke sollten alle dahingehend untersucht werden, ob sie durch CASEAusdrücke bzw. „outer join“-Formulierungen ersetzt werden können. Beispiel: SELECT sum(amount) AS tot1 , 0 , 0 , 0 , 0 FROM tab_1 t1, tab_2 t2, tab_3 WHERE t1.col1 = t2.col2 AND t1.col1 = t3.col3 AND t1.col2 = t4.col4 AND t1.colx IN ( ‘X’, ‘Y’, ‘Z’ ) UNION ALL SELECT 0 , sum(amount) AS tot2 , 0 , 0 , 0 FROM tab_1 t1, tab_2 t2, tab_3 WHERE t1.col1 = t2.col2 AND t1.col1 = t3.col3 AND t1.col2 = t4.col4 AND t1.colx IN ( ‘A’, ‘B’, ‘C’ ) UNION ALL SELECT 0 , 0 , sum(amount) AS tot3 , 0 , 0 FROM tab_1 t1, tab_2 t2, tab_3 WHERE t1.col1 = t2.col2 AND t1.col1 = t3.col3 AND t1.col2 = t4.col4 AND t1.colx IN ( ‘E’, ‘F’, ‘G’ ) UNION ALL SELECT 0 , 0 , 0 , sum(amount) AS tot4 , 0 FROM tab_1 t1, tab_2 t2, tab_3 WHERE t1.col1 = t2.col2 AND t1.col1 = t3.col3 AND t1.col2 = t4.col4 AND t1.colx IN ( ‘Q’, ‘R’, ‘S’ ) UNION ALL SELECT 0 , 0 , 0 , 0 , sum(amount) AS tot5 FROM tab_1 t1, tab_2 t2, tab_3 WHERE t1.col1 = t2.col2 AND t1.col1 = t3.col3 AND t1.col2 = t4.col4 AND t1.colx IN ( ‘T’, ‘U’, ‘V’ ) ORDER BY 2 , 4 , 3 t3, tab_4 t4 t3, tab_4 t4 t3, tab_4 t4 t3, tab_4 t4 t3, tab_4 t4 Bild-57: Die UNION / CASE Alternative © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 75 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index …. und hier dieselbe Query mit effizienten CASE-Statements: SELECT sum( CASE END) sum( CASE END) sum( CASE END) sum( CASE END) sum( CASE END) FROM , tab_2 , tab_3 , tab_4 WHERE AND AND AND WHEN (t1.colx = THEN AMOUNT ‘X’ OR t1.colx = ‘Y’ ….) WHEN (t1.colx = THEN AMOUNT ‘A’ OR t1.colx = ‘B’ ….) WHEN (t1.colx = THEN AMOUNT ‘E’ OR t1.colx = ‘F’ ….) WHEN (t1.colx = THEN AMOUNT ‘Q’ OR t1.colx = ‘R’ ….) WHEN (t1.colx = THEN AMOUNT ‘T’ OR t1.colx = ‘U’ ….) tab_1 t2 t3 t4 t1.col1 t1.col1 t1.col2 t1.colx t1 = = = IN t2.col2 t3.col3 t4.col4 ( ‘A’ , ‘B’ , ‘C’ , ‘E’ , ‘F’ , ‘G’ , ‘Q’ , ‘R’ , ‘S’ , ‘T’, ‘U’, ‘V’ , ‘X’ , ‘Y’ , ‘Z’ ) ORDER BY 2 , 4 , 3 Bild-58: Die CASE Alternative zum UNION © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 76 von 127 DB2-Optimierung und SQL-Performance 4.4.4 Kapitel 11: Anhang – Index Spezielle Techniken Hier einige Techniken, mit denen man die Logik innerhalb der „DB2 engine“ im Sinne von Performance positiv beeinflussen kann. 4.4.4.1 CASE in Prädikaten Die Nutzung von CASE ist entgegen manchen Aussagen nicht grundsätzlich von Übel. Benutzt man den CASE-Ausdruck allerdings innerhalb eines WHEREPrädikates, verursacht man nicht unerheblichen Stage-2 Overhead. Im folgenden sollen mehrfache Queries oder auch „dynamisches SQL“ durch komplexe SQL-Formulierungen eliminiert werden. Die Formel hier für ist einfach: • • Lassen Sie SQL arbeiten • Ermöglichen Sie der „engine: DB2 soll dieses optimieren 1. Das Anwenden der Prädikate 2. Das Durchführen der JOINs 3. Das Vermeiden/Durchführen von SORTs 4. Das Durchführen von Berechnungen 5. Das Durchführen von Datentransformationen Die Methode zum Aufbau von Komplexen SQL-Formulierungen lautet: 1. Sammeln aller Anforderungen 2. Auflisten der Tabellen für: • Datenanzeige • Datenfilterung • Joins 3. Erzeugen der JOIN-Prädikate 4. Erzeugen der lokalen Prädikate 5. Erzeugen der „look-up“ Subqueries 6. Hinzufügen der Datentransformationen im SELECT 7. Hinzufügen von GROUP BY / HAVING (falls erforderlich) 8. Hinzufügen von FULL/LEFT Join (falls erforderlich) 9. Hinzufügen von „table expressions“ (falls erforderlich) 10. Zusammenfügen der Komponenten 11. Test 12. EXPLAIN – Tuning (falls erforderlich) © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 77 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index Beispiel: Alle :ws Hostvariablen, die zu Vergleichen genutzt werden, sind auf <blank> oder andere <defaults> gesetzt, bevor die Query das „filtering“ einschaltet. SELECT ….. FROM .... WHERE …. ------------------------------------------------------------------- SELECT account nummern gruppe ------------------------------------------------------------------AND ( CASE WHEN :ws-acct-num-range = ‚Y’ THEN acct_nummer ELSE ‚ ‚ END ) BETWEEN :ws-acct-low AND :ws-acct-high ------------------------------------------------------------------- SELECT gruppen nummern gruppe ------------------------------------------------------------------AND ( CASE WHEN :ws-group-num-range = ‚Y’ THEN ( grp_num_id CONCAT Sub_grp_num_id CONCAT DIGITS(grp_num_seq ) ELSE ‚ ‚ END ) BETWEEN :ws-grp-low AND :ws-grp-high ------------------------------------------------------------------- SELECT serielle nummern gruppe ------------------------------------------------------------------AND ( CASE WHEN :ws-serial-search THEN serial_code ELSE ‚ ‚ END ) = :ws-serial-code AND ( CASE WHEN :ws-serial-search THEN domain ELSE ‚ ‚ END ) = :ws-domain AND ( CASE WHEN :ws-serial-search THEN serial_num ELSE 000000000 END ) BETWEEN :ws-ser-low AND = ‚Y’ = ‚Y’ = ‚Y’ :ws-ser-high Bild-59: CASE in Prädikaten – Beispiel © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 78 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.4.2 CASE in UPDATE – Anweisungen CASE Ausdrücke können in vielen Fällen erfolgreich genutzt werden. Der beste Weg, um dafür ein Gefühl zu entwickeln ist, eineige der folgenden Beispiele zu betrachten. CASE Ausdrücke können die Logik, die über UNION, UNION ALL oder über komplexe OR-Klausel formuliert wurde, eliminieren. Die Methode teilt die Ergebnisse in mehrere Rückgabewerte ein, was DB2 dazu zwingen kann, mehrfach dieselben Datenpages lesen zu müssen. Im Gegensatz dazu, kann man dieselben Daten mit einer CASE "expression" und "one pass" durch die Daten gewinnen. Deshalb können CASE Ausdrücke die "elapsed time" von Queries signifikant senken. Dies gilt auch für UPDATEs, wie folgende Beispiele zeigen. 1. Die Gehaltserhöhung hängt von der Jobklasse ab und bestimmte Klassen erhalten somit 10%, andere 8%, weitere 5% und wieder andere 3.5% Erhöhung. Man kann hier mehrere UPDATE Statements formulieren, aber auch nur ein UPDATE mit einer CASE Expression. UPDATE SET WHERE TBEMPLOYEE SALARY = SALARY * 1.10 JOB IN (‘MANAGER’ , ‘SUPRVSR’) ; UPDATE SET WHERE TBEMPLOYEE SALARY = SALARY * 1.08 JOB IN (‘DBA’ , ‘SYS PROG’) ; UPDATE TBEMPLOYEE SET SALARY = SALARY * 1.05 WHERE JOB = ‘PRGRMR’ ; UPDATE SET WHERE TBEMPLOYEE SALARY = SALARY * 1.035 JOB NOT IN (‘MANAGER’ , ‘SUPRVSR’, ‘DBA’ , ‘SYS PROG’, ‘PRGRMR’) ; UPDATE SET TBEMPLOYEE SALARY = CASE WHEN JOB IN (‘MANAGER’ , ‘SUPRVSR’) THEN SALARY * 1.10 WHEN JOB IN (‘DBA’ , ‘SYS PROG’) THEN SALARY * 1.08 WHEN JOB = ‘PRGRMR’ THEN SALARY * 1.05 ELSE SALARY * 1.035 END ; Bild-59a: Ein Update mit einer CASE "expression" und "one pass" auf die Daten (Beispiel-1) 2. Im folgenden Beispiel wird das Feld ORDERSTATUS in der Tabelle TBORDER abhängig vom Wert in der Spalte ORDERDATE modigiziert. Man lann dies mit drei SQL Statements und drei Durchläufe durch die Daten erreichen, oder mit einem SQL Statement und einem entsprechenden CASE Ausdruck und einem Durchluaf durch die Daten. Zusätzlich dazu vereinfacht sich die Logik. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 79 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index UPDATE SET WHERE TBORDER ORDERSTATUS = '0' ORDERDATE <= CURRENT DATE + 30 DAYS ; UPDATE SET WHERE AND TBORDER ORDERSTATUS = '1' ORDERDATE > CURRENT DATE + 30 DAYS ORDERDATE <= CURRENT DATE + 60 DAYS ; UPDATE SET WHERE TBORDER ORDERSTATUS = '2' ORDERDATE > CURRENT DATE + 60 DAYS ; UPDATE SET TBORDER ORDERSTATUS = CASE WHEN ORDERDATE <= CURRENT DATE + 30 DAYS THEN ‘0’ WHEN (ORDERDATE > CURRENT DATE + 30 DAYS AND ORDERDATE <= CURRENT DATE + 60 DAYS) THEN '1' WHEN ORDERDATE > CURRENT DATE + 60 DAYS THEN '2' END ; Bild 59b: Update implementiert mit CASE Ausdruck (Beispiel-2) © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 80 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 4.4.4.3 CASE zum Vermeiden von Rechen- oder anderen Fehlern Im nächsten Beispiel wird eine "CASE expression" verwendet, um das Problem "Division durch 0" zu vermeiden. Es zeigt eine Akkumulations- bzw. Summierungsoperation. In der ersten Query wäre es möglich, einen Fehler zu bekommen, das die ....... © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 81 von 127 DB2-Optimierung und SQL-Performance © S.K. Consulting Services Kapitel 11: Anhang – Index ++49 8106 994390 www.sk-consulting.de Seite 82 von 127 DB2-Optimierung und SQL-Performance © S.K. Consulting Services Kapitel 11: Anhang – Index ++49 8106 994390 www.sk-consulting.de Seite 83 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index 11.4 Index „ „single“ SQL-Statement 48 A access path 30 ACCESSTYPE 95, 110, 111, 112, 113, 114, 115, 119, 155 Accounting 160, 166, 167 ACQUIRE 30 AE 13 Application Elapsed Time 167 Application Elapsed TIme 167 autocommit 29, 30 B BIND 27, 143, 162 BM 101, 102 bool´sche Operationen 17 Boolean Term 103, 145 BSDS 189 BT 103, 145 buffer pool 189, 201 Bufferpool 15, 16, 27, 102, 121, 158, 159 Bufferpool-Grösse 27 C CASE-Expression 54 catalog visibility 161 CICS 15 CLOSE 218 clustering 192 clustering index 24 Column Functions 28 COMMIT 218 compound 144 Compound 103, 144 correlated 55, 56, 59, 60, 97, 103, 108, 121 Correlated Subquery 59, 60, 172 CPU-Time 161 deadlock DELETE Disk Paths DISPLAY-Command Distinct-Set DM DML DSNZPARM DWH Dynamic EXPLAIN 29 160 27 160 28 101, 103, 104 17, 18 25 23 27 E EDITPROC 15 EDM-Pool 23 Elapsed 27, 161, 167 Elapsed Time 27, 161, 167 Elapsed Wait Time 167 End Users Response Time 166 EXPLAIN 15, 27, 28, 60, 95, 96, 110, 114, 115, 119, 121, 123, 125, 155, 160 EXPLAIN-Option 27 EXPLAIN-Output 28 F FIFO Filterfaktor Filterfaktoren foreign key free space FREQVAL Funktionsentwurf 24 27 171 198, 201, 211, 215 193, 201 162 12 G Generierungsparameter 15 GET PAGE 101 GET PAGES 158, Siehe Get Page, Siehe Get Page, Siehe Get Page Global Temporary Tables 26, 27 Governor 160 GROUP BY 18, 26, 27, 28, 168, 171 H D Hit Ratio database 186, 187, 191, 193, 196, 197, 198, 199, 204, 205, 209, 211, 212, 214, 215, 216, 218, 219, 220, 221, 222, 224 DATABASE 160 data-pages 111 DB2-Elapsed Time 167 DB2-Estimator 161 DB2I 161 DB2PM 160, 166 DB2-Systemparameter 16 DB2-Tuning 12 DB2-Zugriffspfad 15 DBA 25, 162 DBD 23, 196, 197 DB-Design 8, 9 DCL 17 DDF 16 DDL 16, 17, 95 © S.K. Consulting Services ++49 8106 994390 158 I I/O Contention 27 I/O Paths 27 IFCID 203, 204 IFI 160 IMS-DB 15 Index 16, 25, 26, 28, 60, 94, 95, 96, 97, 103, 104, 105, 106, 107, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 121, 123, 145, 153, 162, 171 INDEX ONLY 109, 114, 115 Index Scan 28 Index screening 29 indexable 103, 105, 106, 108, 109 Indexable 103, 105, 144 indexable Prädikate 103 Indexable Predicates 106 www.sk-consulting.de Seite 84 von 127 DB2-Optimierung und SQL-Performance Indexe Indexes INDEXONLY Index-Only-Zugriff Indexscreening Index-Screening indizierbar INSERT Intersektionsmenge IRLM Kapitel 11: Anhang – Index 24, 123 24, 25, 26, 28, 59, 115, 172 114, 115 26 103 106 109 17, 18, 160 21 15, 204, 205, 207, 222 J Join 16, 17, 26, 28, 59, 101, 110, 120, 122, 144, 172 JOIN 19, 21, 22, 24, 59, 60, 97, 103, 110, 121, 144, 155, 171, 172 JOIN Tuning 171 Join-Operation 26 JOIN-Prädikat 144 Joins 28, 31, 56, 144 K karthesische 21 karthesische Produkt 21 Katalog 15, 95, 142, 143, 145, 160, 161 KEYCARD 162 Korrelation 144 N nested loop nested table expression nicht-indizierbar non-correlated Non-Correlated Non-Correlated Subquery non-Indexable Non-Indexable non-matching index scan non-sargable NON-SARGABLE NON-uniform distribution NULL 120, 121, 123 53 109 56, 59 59, 60, 172 59, 60, 172 103 144 111, 112 103, 109 104 145 198 O ONE MERGE PASS 123 One-Fetch index scan 114 Optimierungsmöglichkeiten 14 Optimizer 12, 26, 101, 103, 110, 143, 160, 162 ORDER BY 26, 27, 112, 168, 171, 221 ORDER BY / GROUP BY 171 OS/390 9, 192, 199, 209, 210, 214, 217, 223, 227, 228, 229 overhead 23, 29, 45, 48 P L latch 24 leaf-pages 111, 112, 113 List prefetch 29 LIST PREFETCH 110, 115, 116, 117, 118 List Sequential Prefetch 26 lnstrumentation Facility 160 LOB 188, 189, 199, 207, 208, 209, 211, 219, 224 Local 144 LOCATION 160 lock escalation 207 Lock escalation 30 LOCK TABLE 30 LOCKMAX 30 locks 29 LOCKSIZE 30 M MATCHCOLS 95, 106, 112, 113, 114, 155 matching 105, 110, 112, 113, 115, 153 matching index scan 111, 112, 113, 114 Materialisierung 16 materialization 153 Materialized Views 26 MERGE SCAN 122, 123 METHOD 95, 121, 123 Methodeneinsatz 13 MIXOPSEQ 119 MI-Zugriff 119 MODIFY 204 multiple index 110 multiple index access 103 MUPA 158, 159 MVS 15, 16, 25, 161 © S.K. Consulting Services ++49 8106 994390 page 29 page set 204, 211, 212, 216, 219, 222 Page Set Scan 16 Page-Marker 27 Paging 16 Paging/Swapping 16 parse-tree 103, 144 parsing 103 Parsing 144 partitioned 145 partitioned IX 145 Performance 12, 13, 14, 25, 26, 27, 31, 96, 103, 153, 160, 162, 166 physische DB2-Objekte 15 PK 24 PLAN TABLE 155 PLAN_TABLE 106, 110, 111, 112, 113, 114, 155, 160 Prädikat 28, 60, 95, 98, 103, 105, 106, 123, 144, 145 Prädikate 16, 17, 26, 28, 60, 101, 102, 103, 104, 106, 111, 112, 113, 114, 123, 144, 153, 171 Prädikatskatekorien 144 prefetch 24, 110, 111, 112, 119 Prefetch 26, 27, 102, 110, 115, 119 PREFETCH 110, 114, 115, 116, 117, 118, 119, 155 Prefetch Rate 27 PREPARE 23, 95 primary key 198, 201, 211, 212, 215, 223 Projektion 17, 20 PTS 145 Q Queries 15, 27, 103, 144, 155, 168, 171 www.sk-consulting.de Seite 85 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Index R RDM 101, 104 RDS 101, 102, 103, 104, 120, 121 REBIND 15, 162, 210 RECOVER 216 REOPT 27 REORG 30, 215 Resource Limit Facility 160 Response Time 166 Result 26, 101 Result Set 26 result table 103, 153 RID 29, 107, 115, 116, 117, 118, 119, 214, 216 RID Pool 29 RLF 160 RLIMIT 160 ROLLBACK 218 ROWID 145 row-level locking 29 RUNSTATS 15, 27, 160, 162 RUNSTATS Utility 27 RUNSTATS-Utility 160 S SAP 23 sargeable 103, 109 sargeable Prädikate 103 segmented TS 23, 24 SELECT 17, 18, 19, 20, 21, 26, 59, 95, 96, 97, 98, 109, 111, 112, 113, 119, 121, 144, 160 Selektion 17, 20, 95 sequential Prefetch 110 Service units 160 Set Functions 28 simple 144 Simple 103, 144 Sort 26, 27, 28, 123 SORT 33, 43, 44, 51, 52, 53, 115, 155 Sort Bufferpool 27 Sort Data columns 26 Sort Key Columns 26 Sort-Aufwand 26 Sort-Performance 26 Sort-Row-Länge 26 space map 211, 216 SQL 8, 9, 186, 187, 189, 191, 192, 194, 196, 197, 199, 200, 201, 202, 210, 212, 213, 214, 215, 216, 218, 219, 220, 221, 222, 223, 224, 227, 228, 229 Stage1 103, 104, 106, 144 Stage2 103, 104, 106, 145 Stage-2 28 Stage2 - Prädikate 104 Static Explain 27 STOGROUP 27 © S.K. Consulting Services ++49 8106 994390 stored procedure STOSPACE STOSPACE-Utility STS subqueries Subquery subquery-nesting SYSADM System-Design 48 160 160 24 54, 56, 97 59, 60, 101, 103, 144, 172 60 213 12 T Table 25, 59, 94, 101, 107, 110, 111, 121, 123 TABLE 189, 194, 197 Tablespace 25, 110, 111 tablespace scan 111 TABLESPACE SCAN 120 task switch overhead 48 Technologie-Einsatz 13 Thread 15, 16, 167 THREAD 160, 167 threads 29 timeout 222 Total Transit Time 166 TRACE 160 TSO 15 Tuningpotentiale 14, 16 U uniform distribution unique index UNIX UPDATE Update Statistik UR UTILITY 145 203, 223 9, 228 17, 18, 25, 160 160 29 160 V VARCHAR VARCHAR-Spalten view virtual storage Virtual Storage Visual Explain VPSEQT VSAM 24, 26, 191 26 186, 194, 209, 221, 222, 224 186, 196, 202, 207 192, 209, 224 125, 160 24 15, 16, 25, 102 W Workfile Dataset Workfile-Space 27 27 Z z/OS 9, 223, 225, 227, 228 www.sk-consulting.de Seite 86 von 127 DB2-Optimierung und SQL-Performance 11.5 Kapitel 11: Anhang – Glossar Glossar A abend. . abend reason code. Abnormal end of task A 4-byte hexadecimal code that uniquely identifies a problem with DB2. A complete list of DB2 abend reason codes and their explanations is contained in DB2 Messages and Codes. abnormal end of task (abend). Termination of a task, job, or subsystem because of an error condition that recovery facilities cannot resolve during execution. access method services. The facility that is used to define and reproduce VSAM key-sequenced data sets. access path. The path that is used to locate data that is specified in SQL statements. An access path can be indexed or sequential. active log. The portion of the DB2 log to which log records are written as they are generated. The active log always contains the most recent log records, whereas the archive log holds those records that are older and no longer fit on the active log. address space. A range of virtual storage pages that is identified by a number (ASID) and a collection of segment and page tables that map the virtual pages to real pages of the computer’s memory address space connection. The result of connecting an allied address space to DB2. Each address space that contains a task that is connected to DB2 has exactly one address space connection, even though more than one task control block (TCB) can be present. See also allied address space and task control block. agent. As used in DB2, the structure that associates all processes that are involved in a DB2 unit of work. An allied agent is generally synonymous with an allied thread. System agents are units of work that process independently of the allied agent, such as prefetch processing, deferred writes, and service tasks. alias. An alternative name that can be used in SQL statements to refer to a table or view in the same or a remote DB2 subsystem. allied address space. An area of storage that is external to DB2 and that is connected to DB2. An allied address space is capable of requesting DB2 services. allied thread. A thread that originates at the local DB2 subsystem and that can access data at a remote DB2 subsystem. ambiguous cursor. A database cursor that is not defined with the FOR FETCH ONLY clause or the FOR<UPDATE OF clause, is not defined on a read-only result table, is not the target of a WHERE CURRENT clause on an SQL UPDATE or DELETE statement, and is in a plan or package that contains either PREPARE or EXECUTE IMMEDIATE SQL statements. APAR. Authorized program analysis report. APAR fix corrective service. A temporary correction of a DB2 defect. The correction is temporary, because it is usually replaced at a later date by a more permanent correction, such as a program temporary fix (PTF). APF. Authorized program facility. API. Application programming interface. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 87 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar APPL. A VTAM network definition statement that is used to define DB2 to VTAM as an application program that uses SNA LU 6.2 protocols. application. A program or set of programs that performs a task; for example, a payroll application. application-directed connection. A connection that an application manages using the SQL CONNECT statement. application plan. The control structure that is produced during the bind process. DB2 uses the application plan to process SQL statements that it encounters during statement execution. application process. The unit to which resources and locks are allocated. An application process involves the execution of one or more programs. application programming interface (API). A functional interface that is supplied by the operating system or by a separately orderable licensed program that allows an application program that is written in a high-level language to use specific data or functions of the operating system or licensed program. application requester. The component on a remote system that generates DRDA requests for data on behalf of an application. An application requester accesses a DB2 database server using the DRDA application-directed protocol. application server. The target of a request from a remote application. In the DB2 environment, the application server function is provided by the distributed data facility and is used to access DB2 data from remote applications archive log. The portion of the DB2 log that contains log records that have been copied from the active log. ASCII. An encoding scheme that is used to represent strings in many environments, typically on PCs and workstations. Contrast with EBCDIC and Unicode . attachment facility. An interface between DB2 and TSO, IMS, CICS, or batch address spaces. An attachment facility allows application programs to access DB2. attribute. A characteristic of an entity. For example, in database design, the phone number of an employee is one of that employee’s attributes. authorization ID. A string that can be verified for connection to DB2 and to which a set of privileges is allowed. It can represent an individual, an organizational group, or a function, but DB2 does not determine this representation. authorized program analysis report (APAR). A report of a problem that is caused by a suspected defect in a current release of an IBM licensed program. authorized program facility (APF). A facility that permits the identification of programs that are authorized to use restricted functions. auxiliary index. An index on an auxiliary table in which each index entry refers to a LOB. auxiliary table. A table that stores columns outside the table in which they are defined. Contrast with base table. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 88 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar B backward log recovery. The fourth and final phase of restart processing during which DB2 scans the log in a backward direction to apply UNDO log records for all aborted changes. base table. (1) A table that is created by the SQL CREATE TABLE statement and that holds persistent data. Contrast with result table and temporary table. (2) A table containing a LOB column definition. The actual LOB column data is not stored with the base table. The base table contains a row identifier for each row and an indicator column for each of its LOB columns. Contrast with auxiliary table. base table space. A table space that contains base tables. basic sequential access method (BSAM). An access method for storing or retrieving data blocks in a continuous sequence, using either a sequential access or a direct access device. before trigger. A trigger that is defined with the trigger activation time BEFORE. binary large object (BLOB). A sequence of bytes where the size of the value ranges from 0 bytes to 2 GB.1. Such a string does not have an associated CCSID. binary string. A sequence of bytes that is not associated with a CCSID. For example, the BLOB data type is a binary string. bind. The process by which the output from the SQL precompiler is converted to a usable control structure, often called an access plan, application plan, or package. During this process, access paths to the data are selected and some authorization checking is performed. The types of bind are: automatic bind. (More correctly, automatic rebind)A process by which SQL statements are bound automatically (without a user issuing a BIND command) when an application process begins execution and the bound application plan or package it requires is not valid. dynamic bind. A process by which SQL statements are bound as they are entered. incremental bind. A process by which SQL statements are bound during the execution of an application process, because they could not be bound during the bind process, and VALIDATE(RUN) was specified. static bind. A process by which SQL statements are bound after they have been precompiled. All static SQL statements are prepared for execution at the same time. BLOB. Binary large object BMP. Batch Message Processing (IMS). bootstrap data set (BSDS). A VSAM data set that contains name and status information for DB2, as well as RBA range specifications, for all active and archive log data sets. It also contains passwords for the DB2 directory and catalog, and lists of conditional restart and checkpoint records. BSAM. Basic sequential access method. BSDS. Bootstrap data set. buffer pool. Main storage that is reserved to satisfy the buffering requirements for one or more table spaces or indexes. built-in function. A function that DB2 supplies. Contrast with user-defined function. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 89 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar C CAF. Call attachment facility. call attachment facility (CAF). A DB2 attachment facility for application programs that run in TSO or MVS batch. The CAF is an alternative to the DSN command processor and provides greater control over the execution environment. cascade delete. The way in which DB2 enforces referential constraints when it deletes all descendent rows of a deleted parent row. cast function. A function that is used to convert instances of a (source) data type into instances of a different (target) data type. In general, a cast function has the name of the target data type. It has one single argument whose type is the source data type; its return type is the target data type. catalog. In DB2, a collection of tables that contains descriptions of objects such as tables, views, and indexes. catalog table. Any table in the DB2 catalog. CCSID. Coded character set identifier. CDB. Communications database. CEC. Central electronic complex. See central processor complex. central electronic complex (CEC). See central processor complex. central processor complex (CPC). A physical collection of hardware (such as an ES/3090) that consists of main storage, one or more central processors, timers, and channels. character large object (CLOB). A sequence of bytes representing single-byte characters or a mixture of single- and double-byte characters where the size of the value can be up to 2 GB.1. In general, character large object values are used whenever a character string might exceed the limits of the VARCHAR type. character set. A defined set of characters. character string. A sequence of bytes that represent bit data, single-byte characters, or a mixture of single-byte and multibyte characters. check constraint. See table check constraint. check integrity. The condition that exists when each row in a table conforms to the table check constraints that are defined on that table. Maintaining check integrity requires DB2 to enforce table check constraints on operations that add or change data. check pending. A state of a table space or partition that prevents its use by some utilities and some SQL statements because of rows that violate referential constraints, table check constraints, or both. checkpoint. A point at which DB2 records internal status information on the DB2 log; the recovery process uses this information if DB2 abnormally terminates. CI. Control interval. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 90 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar CICS. Represents one of the following products: CICS Transaction Server for OS/390: Customer Information Control System Transaction Server for OS/390 CICS/ESA: Customer Information Control System/Enterprise Systems Architecture CICS/MVS: Customer Information Control System/Multiple Virtual Storage CICS attachment facility. A DB2 subcomponent that uses the MVS subsystem interface (SSI) and cross storage linkage to process requests from CICS to DB2 and to coordinate resource commitment. CIDF. Control interval definition field. claim. A notification to DB2 that an object is being accessed. Claims prevent drains from occurring until the claim is released, which usually occurs at a commit point. Contrast with drain. claim class. A specific type of object access that can be one of the following: Cursor stability (CS) Repeatable read (RR) Write claim count. A count of the number of agents that are accessing an object. class of service. A VTAM term for a list of routes through a network, arranged in an order of preference for their use. clause. In SQL, a distinct part of a statement, such as a SELECT clause or a WHERE clause. client. See requester. CLIST. Command list. A language for performing TSO tasks. CLOB. Character large object. CLPA. Create link pack area. clustering index. An index that determines how rows are physically ordered in a table space. coded character set. A set of unambiguous rules that establish a character set and the oneto-one relationships between the characters of the set and their coded representations. coded character set identifier (CCSID). A 16-bit number that uniquely identifies a coded representation of graphic characters. It designates an encoding scheme identifier and one or more pairs consisting of a character set identifier and an associated code page identifier. column. The vertical component of a table. A column has a name and a particular data type (for example, character, decimal, or integer). column function. An operation that derives its result by using values from one or more rows. Contrast with scalar function. "come from" checking. An LU 6.2 security option that defines a list of authorization IDs that are allowed to connect to DB2 from a partner LU. command. A DB2 operator command or a DSN subcommand. A command is distinct from an SQL statement. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 91 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar command recognition character (CRC). A character that permits an MVS console operator or an IMS subsystem user to route DB2 commands to specific DB2 subsystems. commit. The operation that ends a unit of work by releasing locks so that the database changes that are made by that unit of work can be perceived by other processes. commit point. A point in time when data is considered consistent. committed phase. The second phase of the multisite update process that requests all participants to commit the effects of the logical unit of work. common service area (CSA). In MVS, a part of the common area that contains data areas that are addressable by all address spaces. communications database (CDB). A set of tables in the DB2 catalog that are used to establish conversations with remote database management systems. comparison operator. A token (such as =, >, <) that is used to specify a relationship between two values. compression dictionary. The dictionary that controls the process of compression and decompression. This dictionary is created from the data in the table space or table space partition. concurrency. The shared use of resources by more than one application process at the same time. conditional restart. A DB2 restart that is directed by a user-defined conditional restart control record (CRCR). connection ID. An identifier that is supplied by the attachment facility and that is associated with a specific address space connection. consistency token. A timestamp that is used to generate the version identifier for an application. See also version. constraint. A rule that limits the values that can be inserted, deleted, or updated in a table. See referential constraint, table check constraint, and uniqueness constraint. control interval (CI). A fixed-length area or direct access storage in which VSAM stores records and creates distributed free space. Also, in a key-sequenced data set or file, the set of records pointed to by an entry in the sequence-set index record. The control interval is the unit of information that VSAM transmits to or from direct access storage. A control interval always includes an integral number of physical records. control interval definition field (CIDF). In VSAM, a field located in the 4 bytes at the end of each control interval; it describes the free space, if any, in the control interval. conversation. Communication, which is based on LU 6.2 or Advanced Program-toProgram Communication (APPC), between an application and a remote transaction program over an SNA logical unit-to-logical unit (LU-LU) session that allows communication while processing a transaction. coordinator. The system component that coordinates the commit or rollback of a unit of work that includes work that is done on one or more other systems. correlated columns. A relationship between the value of one column and the value of another column. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 92 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar correlated subquery. A subquery (part of a WHERE or HAVING clause) that is applied to a row or group of rows of a table or view that is named in an outer subselect statement. correlation ID. An identifier that is associated with a specific thread. In TSO, it is either an authorization ID or the job name. correlation name. An identifier that designates a table, a view, or individual rows of a table or view within a single SQL statement. It can be defined in any FROM clause or in the first clause of an UPDATE or DELETE statement. cost category. A category into which DB2 places cost estimates for SQL statements at the time the statement is bound. A cost estimate can be placed in either of the following cost categories: v A: Indicates that DB2 had enough information to make a cost estimate without using default values. v B: Indicates that some condition exists for which DB2 was forced to use default values for its estimate. The cost category is externalised in the COST_CATEGORY column of the DSN_STATEMNT_TABLE when a statement is explained. CPC. Central processor complex. CRC. Command recognition character. CRCR. Conditional restart control record. See also conditional restart. create link pack area (CLPA). An option used during IPL to initialise the link pack pageable area. created temporary table. A table that holds temporary data and is defined with the SQL statement CREATE GLOBAL TEMPORARY TABLE. Information about created temporary tables is stored in the DB2 catalog, so this kind of table is persistent and can be shared across application processes. Contrast with declared temporary table. See also temporary table. cross-memory linkage. A method for invoking a program in a different address space. The invocation is synchronous with respect to the caller. CS. Cursor stability. CSA. Common service area. CT. Cursor table. current status rebuild. The second phase of restart processing during which the status of the subsystem is reconstructed from information on the log. cursor. A named control structure that an application program uses to point to a row of interest within some set of rows, and to retrieve rows from the set, possibly making updates or deletions. cursor stability (CS). The isolation level that provides maximum concurrency without the ability to read uncommitted data. With cursor stability, a unit of work holds locks only on its uncommitted changes and on the current row of each of its cursors. cursor table (CT). The copy of the skeleton cursor table that is used by an executing application process. cycle. A set of tables that can be ordered so that each table is a descendent of the one before it, and the first table is a descendent of the last table. A self-referencing table is a cycle with a single member. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 93 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar D DASD. Direct access storage device. database. A collection of tables, or a collection of table spaces and index spaces. database access thread. A thread that accesses data at the local subsystem on behalf of a remote subsystem. database administrator (DBA). An individual who is responsible for designing, developing, operating, safeguarding, maintaining, and using a database. database descriptor (DBD). An internal representation of a DB2 database definition, which reflects the data definition that is in the DB2 catalog. The objects that are defined in a database descriptor are table spaces, tables, indexes, index spaces, and relationships. database management system (DBMS). A software system that controls the creation, organization, and modification of a database and the access to the data stored within it. database request module (DBRM). A data set member that is created by the DB2 precompiler and that contains information about SQL statements. DBRMs are used in the bind process. database server. The target of a request from a local application or an intermediate database server. In the DB2 environment, the database server function is provided by the distributed data facility to access DB2 data from local applications, or from a remote database server that acts as an intermediate database server. DATABASE 2 Interactive (DB2I). The DB2 facility that provides for the execution of SQL statements, DB2 (operator) commands, programmer commands, and utility invocation. data definition name (ddname). The name of a data definition (DD) statement that corresponds to a data control block containing the same name. Data Language/I (DL/I). The IMS data manipulation language; a common high-level interface between a user application and IMS. data sharing. The ability of two or more DB2 subsystems to directly access and change a single set of data. data sharing group. A collection of one or more DB2 subsystems that directly access and change the same data while maintaining data integrity. data sharing member. A DB2 subsystem that is assigned by XCF services to a data sharing group. data space. A range of up to 2 GB of contiguous virtual storage addresses that a program can directly manipulate. Unlike an address space, a data space can hold only data; it does not contain common areas, system data, or programs. data type. An attribute of columns, literals, host variables, special registers, and the results of functions and expressions. date. A three-part value that designates a day, month, and year. date duration. decimal integer that represents a number of years, months, and days. datetime value. A value of the data type DATE, TIME, or TIMESTAMP. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 94 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar DBA. Database administrator. DBCLOB. Double-byte character large object. DBCS. Double-byte character set. DBD. Database descriptor. DBID. Database identifier. DBMS. Database management system. DBRM. Database request module. DB2 catalog. Tables that are maintained by DB2 and contain descriptions of DB2 objects, such as tables, views, and indexes. DB2 command. An instruction to the DB2 subsystem allowing a user to start or stop DB2, to display information on current users, to start or stop databases, to display information on the status of databases, and so on. DB2 for VSE & VM. The IBM DB2 relational database management system for the VSE and VM operating systems. DB2I. DATABASE 2 Interactive. DB2I Kanji Feature. The tape that contains the panels and jobs that allow a site to display DB2I panels in Kanji. DB2 PM. DATABASE 2 Performance Monitor. DCLGEN. Declarations generator. DDF. Distributed data facility. ddname. Data definition name. deadlock. Unresolvable contention for the use of a resource such as a table or an index. declarations generator (DCLGEN). A subcomponent of DB2 that generates SQL table declarations and COBOL, C, or PL/I data structure declarations that conform to the table. The declarations are generated from DB2 system catalog information. DCLGEN is also a DSN subcommand. declared temporary table. A table that holds temporary data and is defined with the SQL statement DECLARE GLOBAL TEMPORARY TABLE. Information about declared temporary tables is not stored in the DB2 catalog, so this kind of table is not persistent and can only be used by the application process that issued the DECLARE statement. Contrast with created temporary table. See also temporary table. default value. A predetermined value, attribute, or option that is assumed when no other is explicitly specified. deferred write. The process of asynchronously writing changed data pages to disk. degree of parallelism. The number of concurrently executed operations that are initiated to process a query. delete rule. The rule that tells DB2 what to do to a dependent row when a parent row is deleted. For each relationship, the rule might be CASCADE, RESTRICT, SET NULL, or NO ACTION. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 95 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar dependent. An object (row, table, or table space) that has at least one parent. The object is also said to be a dependent (row, table, or table space) of its parent. See parent row, parent table, parent table space. dependent row. A row that contains a foreign key that matches the value of a primary key in the parent row. dependent table. A table that is a dependent in at least one referential constraint. descendent. An object that is a dependent of an object or is the dependent of a descendent of an object. descendent row. A row that is dependent on another row, or a row that is a descendent of a dependent row. descendent table. A table that is a dependent of another table, or a table that is a descendent of a dependent table. DFHSM. Data Facility Hierarchical Storage Manager. DFP. Data Facility Product (in MVS). dimension. A data category such as time, products, or markets. The elements of a dimension are referred to as members. Dimensions offer a very concise, intuitive way of organizing and selecting data for retrieval, exploration, and analysis. See also dimension table. dimension table. The representation of a dimension in a star schema. Each row in a dimension table represents all of the attributes for a particular member of the dimension. See also dimension, star schema, and star join. direct access storage device (DASD). A device in which access time is independent of the location of the data. directory. The DB2 system database that contains internal objects such as database descriptors and skeleton cursor tables. distinct type. A user-defined data type that is internally represented as an existing type (its source type), but is considered to be a separate and incompatible type for semantic purposes. Distributed Computing Environment MVS/ESA ™ (DCE MVS/ESA). A set of technologies that are provided by the Open Software Foundation to implement distributed computing. distributed data facility (DDF). A set of DB2 components through which DB2 communicates with another RDBMS. Distributed Relational Database Architecture (DRDA). A connection protocol for distributed relational database processing that is used by IBM’s relational database products. DRDA includes protocols for communication between an application and a remote relational database management system, and for communication between relational database management systems. DL/I. Data Language/I. double-byte character large object (DBCLOB). A sequence of bytes representing double-byte characters where the size of the values can be up to 2 GB. In general, double-byte character large object values are used whenever a double-byte character string might exceed the limits of the VARGRAPHIC type. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 96 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar double-byte character set (DBCS). A set of characters, which are used by national languages such as Japanese and Chinese, that have more symbols than can be represented by a single byte. Each character is 2 bytes in length. Contrast with single-byte character set and multibyte character set. drain. The act of acquiring a locked resource by quiescing access to that object. drain lock. A lock on a claim class that prevents a claim from occurring. DRDA. Distributed Relational Database Architecture. DRDA access. An open method of accessing distributed data that you can use to can connect to another database server to execute packages that were previously bound at the server location. You use the SQL CONNECT statement or an SQL statement with a three-part name to identify the server. Contrast with private protocol access. DSN. (1) The default DB2 subsystem name. (2) The name of the TSO command processor of DB2. (3) The first three characters of DB2 module and macro names. duration. A number that represents an interval of time. See date duration, labeled duration, and time duration. dynamic SQL. SQL statements that are prepared and executed within an application program while the program is executing. In dynamic SQL, the SQL source is contained in host language variables rather than being coded into the application program. The SQL statement can change several times during the application program’s execution © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 97 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar E EA-enabled table space. A table space or index space that is enabled for extended addressability and that contains individual partitions (or pieces, for LOB table spaces) that are greater than 4 GB. EBCDIC. Extended binary coded decimal interchange code. An encoding scheme that is used to represent character data in the OS/390, MVS, VM, VSE, and OS/400 ® environments. Contrast with ASCII and Unicode. EDM pool. A pool of main storage that is used for database descriptors, application plans, authorization cache, application packages, and dynamic statement caching. EID. Event identifier. embedded SQL. SQL statements that are coded within an application program. See static SQL. enclave. In Language Environment, an independent collection of routines, one of which is designated as the main routine. An enclave is similar to a program or run unit. EOM. End of memory. EOT. End of task. Equi join. A join operation in which the join-condition has the form expression = expression. error page range. A range of pages that are considered to be physically damaged. DB2 does not allow users to access any pages that fall within this range. ESDS. Entry sequenced data set. ESMT. External subsystem module table (in IMS). EUR. IBM European Standards. exception table. A table that holds rows that violate referential constraints or table check constraints that the CHECK DATA utility finds. exclusive lock. A lock that prevents concurrently executing application processes from reading or changing data. Contrast with share lock. exit routine. A user-written (or IBM-provided default) program that receives control from DB2 to perform specific functions. Exit routines run as extensions of DB2. expression. An operand or a collection of operators and operands that yields a single value. extended recovery facility (XRF). A facility that minimizes the effect of failures in MVS, VTAM, the host processor, or high-availability applications during sessions between high-availability applications and designated terminals. This facility provides an alternative subsystem to take over sessions from the failing subsystem. external function. © S.K. Consulting Services A function for which the body is written in a programming language that takes scalar argument values and produces a scalar result for each invocation. Contrast with sourced function, built-in function, and SQL function. ++49 8106 994390 www.sk-consulting.de Seite 98 von 127 DB2-Optimierung und SQL-Performance external routine. Kapitel 11: Anhang – Glossar A user-defined function or stored procedure that is based on code that is written in an external programming language. External subsystem module table (ESMT). The name of the external subsystem module table, which specifies which attachment modules must be loaded by IMS. F fallback. The process of returning to a previous release of DB2 after attempting or completing migration to a current release. field procedure. A user-written exit routine that is designed to receive a single value and transform (encode or decode) it in any way the user can specify. filter factor. A number between zero and one that estimates the proportion of rows in a table for which a predicate is true. fixed-length string. A character or graphic string whose length is specified and cannot be changed. Contrast with varying-length string. foreign key. A column or set of columns in a dependent table of a constraint relationship. The key must have the same number of columns, with the same descriptions, as the primary key of the parent table Each foreign key value must either match a parent key value in the related parent table or be null. forward log recovery. The third phase of restart processing during which DB2 processes the log in a forward direction to apply all REDO log records. free space. T he total amount of unused space in a page; that is, the space that is not used to store records or control information is free space. full outer join. The result of a join operation that includes the matched rows of both tables that are being joined and preserves the unmatched rows of both tables. See also join. function. A mapping, embodied as a program (the function body), invocable by means of zero or more input values (arguments), to a single value (the result). See also column function and scalar function. Functions can be user-defined, built-in, or generated by DB2. (See built-in function, cast function, external function, sourced function, SQL function, and user-defined function.) © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 99 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar G GB. Gigabyte (1 073 741 824 bytes). GBP. Group buffer pool. generalized trace facility (GTF). An MVS service program that records significant system events such as I/O interrupts, SVC interrupts, program interrupts, or external interrupts. generic resource name. A name that VTAM uses to represent several application programs that provide the same function in order to handle session distribution and balancing in a Sysplex environment. getpage. An operation in which DB2 accesses a data page. GIMSMP. The load module name for the System Modification Program/Extended, a basic tool for installing, changing, and controlling changes to programming systems. graphic string. A sequence of DBCS characters. gross lock. The shared, update,orexclusive mode locks on a table, partition, or table space. group buffer pool (GBP). A coupling facility cache structure that is used by a data sharing group to cache data and to ensure that the data is consistent for all members. GTF. Generalized trace facility. H help panel. A screen of information presenting tutorial text to assist a user at the terminal. hiperspace. A range of up to 2 GB of contiguous virtual storage addresses that a program can use as a buffer. Like a data space, a hiperspace can hold user data; it does not contain common areas or system data. Unlike an address space or a data space, data in a hiperspace is not directly addressable. To manipulate data in a hiperspace, bring the data into the address space in 4-KB blocks. home address space. The area of storage that MVS currently recognizes as dispatched. host language. A programming language in which you can embed SQL statements. host program. An application program that is written in a host language and that contains embedded SQL statements. host structure. In an application program, a structure that is referenced by embedded SQL statements. host variable. In an application program, an application variable that is referenced by embedded SQL statements. HSM. Hierarchical storage manager. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 100 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar I ICF. Integrated catalog facility. IDCAMS. An IBM program that is used to process access method services commands. It can be invoked as a job or jobstep, from a TSO terminal, or from within a user’s application program. IDCAMS LISTCAT. A facility for obtaining information that is contained in the access method services catalog. identify. A request that an attachment service program in an address space that is separate from DB2 issues via the MVS subsystem interface to inform DB2 of its existence and to initiate the process of becoming connected to DB2. identity column. A column that provides a way for DB2 to automatically generate a numeric value for each row. The generated values are unique if cycling is not used. Identity columns are defined with the AS IDENTITY clause. Uniqueness of values can be ensured by defining a single-column unique index using the identity column. A table can have no more than one identity column. IFCID. Instrumentation facility component identifier. IFI. Instrumentation facility interface. IFI call. An invocation of the instrumentation facility interface (IFI) by means of one of its defined functions. IFP. IMS Fast Path. image copy. An exact reproduction of all or part of a table space. DB2 provides utility programs to make full image copies (to copy the entire table space) or incremental image copies (to copy only those pages that have been modified since the last image copy). IMS. Information Management System. IMS attachment facility. A DB2 subcomponent that uses MVS subsystem interface (SSI) protocols and cross-memory linkage to process requests from IMS to DB2 and to coordinate resource commitment. IMS DB. Information Management System Database. IMS TM. Information Management System Transaction Manager. in-abort. A status of a unit of recovery. If DB2 fails after a unit of recovery begins to be rolled back, but before the process is completed, DB2 continues to back out the changes during restart. in-commit. A status of a unit of recovery. If DB2 fails after beginning its phase 2 commit processing, it "knows," when restarted, that changes made to data are consistent. Such units of recovery are termed in-commit. independent. An object (row, table, or table space) that is neither a parent nor a dependent of another object. index. A set of pointers that are logically ordered by the values of a key. Indexes can provide faster access to data and can enforce uniqueness on the rows in a table. index key. The set of columns in a table that is used to determine the order of index entries. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 101 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar index partition. A VSAM data set that is contained within a partitioning index space. index space. A page set that is used to store the entries of one index. indicator variable. A variable that is used to represent the null value in an application program. If the value for the selected column is null, a negative value is placed in the indicator variable. indoubt. A status of a unit of recovery. If DB2 fails after it has finished its phase 1 commit processing and before it has started phase 2, only the commit coordinator knows if an individual unit of recovery is to be committed or rolled back. At emergency restart, if DB2 lacks the information it needs to make this decision, the status of the unit of recovery is indoubt until DB2 obtains this information from the coordinator. More than one unit of recovery can be indoubt at restart. indoubt resolution. The process of resolving the status of an indoubt logical unit of work to either the committed or the rollback state. inflight. A status of a unit of recovery. If DB2 fails before its unit of recovery completes phase 1 of the commit process, it merely backs out the updates of its unit of recovery at restart. These units of recovery are termed inflight. inner join. The result of a join operation that includes only the matched rows of both tables being joined. See also join. inoperative package. A package that cannot be used because one or more user-defined functions or procedures that the package depends on were dropped. Such a package must be explicitly rebound. Contrast with invalid package. install. The process of preparing a DB2 subsystem to operate as an MVS subsystem. installation verification scenario. A sequence of operations that exercises the main DB2 functions and tests whether DB2 was correctly installed. instrumentation facility component identifier (IFCID). A value that names and identifies a trace record of an event that can be traced. As a parameter on the START TRACE and MODIFY TRACE commands, it specifies that the corresponding event is to be traced. instrumentation facility interface (IFI). A programming interface that enables programs to obtain online trace data about DB2, to submit DB2 commands, and to pass data to DB2. Interactive System Productivity Facility (ISPF). An IBM licensed program that provides interactive dialog services. intermediate database server. The target of a request from a local application or a remote application requester that is forwarded to another database server. In the DB2 environment, the remote request is forwarded transparently to another database server if the object that is referenced by a three-part name does not reference the local location. internal resource lock manager (IRLM). An MVS subsystem that DB2 uses to control communication and database locking. invalid package. © S.K. Consulting Services A package that depends on an object (other than a user-defined function) that is dropped. Such a package is implicitly rebound on invocation. Contrast with inoperative package. ++49 8106 994390 www.sk-consulting.de Seite 102 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar IRLM. Internal resource lock manager. ISO. International Standards Organization. isolation level. The degree to which a unit of work is isolated from the updating operations of other units of work. See also cursor stability, read stability, repeatable read, and uncommitted read. ISPF. Interactive System Productivity Facility. ISPF/PDF. Interactive System Productivity Facility/Program Development Facility. J Japanese Industrial Standards Committee (JISC). An organization that issues standards for coding character sets. Java Archive (JAR). A file format that is used for aggregating many files into a single file. JCL. Job control language. JES. MVS Job Entry Subsystem. JIS. Japanese Industrial Standard. job control language (JCL). A control language that is used to identify a job to an operating system and to describe the job’s requirements. Job Entry Subsystem (JES). An IBM licensed program that receives jobs into the system and processes all output data that is produced by the jobs. join. A relational operation that allows retrieval of data from two or more tables based on matching column values. See also equijoin, full outer join, inner join, left outer join, outer join, and right outer join. K KB. Kilobyte (1024 bytes). Kerberos. A network authentication protocol that is designed to provide strong authentication for client/server applications by using secret-key cryptography. Kerberos ticket. A transparent application mechanism that transmits the identity of an initiating principal to its target. A simple ticket contains the principal’s identity, a session key, a timestamp, and other information, which is sealed using the target’s secret key. key. A column or an ordered collection of columns identified in the description of a table, index, or referential constraint. key-sequenced data set (KSDS). A VSAM file or data set whose records are loaded in key sequence and controlled by an index. KSDS. © S.K. Consulting Services Key-sequenced data set. ++49 8106 994390 www.sk-consulting.de Seite 103 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar L labeled duration. A number that represents a duration of years, months, days, hours, minutes, seconds, or microseconds. large object (LOB). A sequence of bytes representing bit data, single-byte characters, double-byte characters, or a mixture of single- and double-byte characters. A LOB can be up to 2 GB.1 byte in length. See also BLOB, CLOB, and DBCLOB. latch. A DB2 internal mechanism for controlling concurrent events or the use of system resources. LCID. Log control interval definition. LDS. Linear data set. leaf page. A page that contains pairs of keys and RIDs and that points to actual data. Contrast with nonleaf page. left outer join. The result of a join operation that includes the matched rows of both tables that are being joined, and that preserves the unmatched rows of the first table. See also join. linear data set (LDS). A VSAM data set that contains data but no control information. A linear data set can be accessed as a byte-addressable string in virtual storage. linkage editor. A computer program for creating load modules from one or more object modules or load modules by resolving cross references among the modules and, if necessary, adjusting addresses. link-edit. The action of creating a loadable computer program using a linkage editor. L-lock. Logical lock. load module. A program unit that is suitable for loading into main storage for execution. The output of a linkage editor. LOB. Large object. LOB lock. A lock on a LOB value. LOB table space. A table space that contains all the data for a particular LOB column in the related base table. local subsystem. The unique RDBMS to which the user or application program is directly connected (in the case of DB2, by one of the DB2 attachment facilities). lock. A means of controlling concurrent events or access to data. DB2 locking is performed by the IRLM. lock duration. The interval over which a DB2 lock is held. lock escalation. The promotion of a lock from a row, page, or LOB lock to a table space lock because the number of page locks that are concurrently held on a given resource exceeds a preset limit. locking. The process by which the integrity of data is ensured. Locking prevents concurrent users from accessing inconsistent data. lock mode. A representation for the type of access that concurrently running programs can have to a resource that a DB2 lock is holding. The resource that is controlled by a DB2 lock. lock object. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 104 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar lock promotion. The process of changing the size or mode of a DB2 lock to a higher level. lock size. The amount of data controlled by a DB2 lock on table data; the value can be a row, a page, a LOB, a partition, a table, or a table space. log. A collection of records that describe the events that occur during DB2 execution and that indicate their sequence. The information thus recorded is used for recovery in the event of a failure during DB2 execution. logical index partition. The set of all keys that reference the same data partition. logical lock (L-lock). The lock type that transactions use to control intra- and inter-DB2 data concurrency between transactions. Contrast with physical lock (Plock). logical recovery pending (LRECP). The state in which the data and the index keys that reference the data are inconsistent. logical unit. An access point through which an application program accesses the SNA network in order to communicate with another application program. logical unit of work (LUW). The processing that a program performs between synchronization points. logical unit of work identifier (LUWID). A name that uniquely identifies a thread within a network. This name consists of a fully-qualified LU network name, an LUW instance number, and an LUW sequence number. log initialization. The first phase of restart processing during which DB2 attempts to locate the current end of the log. log record sequence number (LRSN). A number that DB2 generates and associates with each log record. DB2 also uses the LRSN for page versioning. The LRSNs that a particular DB2 data sharing group generates form a strictly increasing sequence for each DB2 log and a strictly increasing sequence for each page across the DB2 group. log truncation. A process by which an explicit starting RBA is established. This RBA is the point at which the next byte of log data is to be written. long string. A string whose actual length, or a varying-length string whose maximum length, is greater than 255 bytes or 127 double-byte characters. Any LOB column, LOB host variable, or expression that evaluates to a LOB is considered a long string. LRECP. Logical recovery pending. LRH. Log record header. LRSN. Log record sequence number. LUW. Logical unit of work. LUWID. #Logical unit of work identifier. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 105 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar M materialize. (1) (2) The process of putting rows from a view or nested table expression into a work file for additional processing by a query. The placement of a LOB value into contiguous storage. Because LOB values can be very large, DB2 avoids materializing LOB data until doing so becomes absolutely necessary. MB. Megabyte (1 048 576 bytes). migration. The process of converting a DB2 subsystem with a previous release of DB2 to an updated or current release. In this process, you can acquire the functions of the updated or current release without losing the data you created on the previous release. mixed data string. A character string that can contain both single-byte and double-byte characters. MLPA. Modified link pack area. MODEENT. A VTAM macro instruction that associates a logon mode name with a set of parameters representing session protocols. A set of MODEENT macro instructions defines a logon mode table. mode name. A VTAM name for the collection of physical and logical characteristics and attributes of a session. MPP. Message processing program (in IMS). MSS. Mass Storage Subsystem. MTO. Master terminal operator. multibyte character set (MBCS). A character set that represents single characters with more than a single byte. Contrast with single-byte character set and double-byte character set. See also Unicode. multisite update. Distributed relational database processing in which data is updated in more than one location within a single unit of work. must-complete. A state during DB2 processing in which the entire operation must be completed to maintain data integrity. MVS. Multiple Virtual Storage. MVS/ESA. Multiple Virtual Storage/Enterprise Systems Architecture. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 106 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar N nested table expression. A fullselect in a FROM clause (surrounded by parentheses). network identifier (NID). The network ID that is assigned by IMS or CICS, or if the connection type is RRSAF, the OS/390 RRS unit of recovery ID (URID). NID. Network ID. nonleaf page. A page that contains keys and page numbers of other pages in the index (either leaf or nonleaf pages). Nonleaf pages never point to actual data. nonpartitioning index. Any index that is not a partitioning index. NPI see nonpartitioning index. NRE. Network recovery element. NUL. In C, a single character that denotes the end of the string. null. A special value that indicates the absence of information. NUL-terminated host variable. A varying-length host variable in which the end of the data is indicated by the presence of a NUL terminator. NUL terminator. In C, the value that indicates the end of a string. For character strings, the NUL terminator is X'00'. O OASN (origin application schedule number). In IMS, a 4-byte number that is assigned sequentially to each IMS schedule since the last cold start of IMS. The OASN is used as an identifier for a unit of work. In an 8-byte format, the first 4 bytes contain the schedule number and the last 4 bytes contain the number of IMS sync points (commit points) during the current schedule. The OASN is part of the NID for an IMS connection. OBID. Data object identifier. originating task. In a parallel group, the primary agent that receives data from other execution units (referred to as parallel tasks) that are executing portions of the query in parallel. OS/390. Operating System/390. OS/390 OpenEdition Distributed Computing Environment (OS/390 OE DCE). A set of technologies that are provided by the Open Software Foundation to implement distributed computing. outer join. © S.K. Consulting Services The result of a join operation that includes the matched rows of both tables that are being joined and preserves some or all of the unmatched rows of the tables that are being joined. See also join. ++49 8106 994390 www.sk-consulting.de Seite 107 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar P package. An object containing a set of SQL statements that have been statically bound and that is available for processing. A package is sometimes also called an application package. package list. An ordered list of package names that may be used to extend an application plan. package name. The name of an object that is created by a BIND PACKAGE or REBIND PACKAGE command. The object is a bound version of a database request module (DBRM). The name consists of a location name, a collection ID, a package ID, and a version ID. page. A unit of storage within a table space (4 KB, 8 KB, 16 KB, or 32 KB) or index space (4 KB). In a table space, a page contains one or more rows of a table. In a LOB table space, a LOB value can span more than one page, but no more than one LOB value is stored on a page. page set. Another way to refer to a table space or index space. Each page set consists of a collection of VSAM data sets. Parallel group. A set of consecutive operations that executed in parallel and that have the same number of parallel tasks. parallel I/O processing. A form of I/O processing in which DB2 initiates multiple concurrent requests for a single user query and performs I/O processing concurrently (in parallel) on multiple data partitions. Parallel Sysplex. A set of MVS systems that communicate and cooperate with each other through certain multisystem hardware components and software services to process customer workloads. parallel task. The execution unit that is dynamically created to process a query in parallel. It is implemented by an MVS service request block. parent row. A row whose primary key value is the foreign key value of a dependent row. parent table. A table whose primary key is referenced by the foreign key of a dependent table. parent table space. A table space that contains a parent table. A table space containing a dependent of that table is a dependent table space. participant. An entity other than the commit coordinator that takes part in the commit process. The term participant is synonymous with agent in SNA. partition. A portion of a page set. Each partition corresponds to a single, independently extendable data set. Partitions can be extended to a maximum size of 1, 2, or 4 GB, depending on the number of partitions in the partitioned page set. All partitions of a given page set have the same maximum size. partitioning index. The index that represents the partitioning values partitioned data set (PDS). A data set in direct access storage that is divided into partitions, which are called members. Each partition can contain a program, part of a program, or data. The term partitioned data set is synonymous with program library. partitioned page set. A partitioned table space or an index space. Header pages, space map pages, data pages, and index pages reference data only within the scope of the partition. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 108 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar partitioned table space. A table space that is subdivided into parts (based on index key range), each of which can be processed independently by utilities. partner logical unit. An access point in the SNA network that is connected to the local DB2 subsystem by way of a VTAM conversation. PCT. Program control table (in CICS). PDS. Partitioned data set. PI see partitioning index. piece. A data set of a nonpartitioned page set. physical consistency. The state of a page that is not in a partially changed state. plan. See application plan. plan allocation. The process of allocating DB2 resources to a plan in preparation for execution. plan name. The name of an application plan. plan segmentation. The dividing of each plan into sections. When a section is needed, it is independently brought into the EDM pool. PLT. Program list table (in CICS). point of consistency. A time when all recoverable data that an application accesses is consistent with other data. The term point of consistency is synonymous with sync point or commit point. postponed abort UR. A unit of recovery that was inflight or in-abort, was interrupted by system failure or cancellation, and did not complete backout during restart. PPT. (1) Processing program table (in CICS). (2) Program properties table (in MVS). precompilation. A processing of application programs containing SQL statements that takes place before compilation. SQL statements are replaced with statements that are recognized by the host language compiler. Output from this precompilation includes source code that can be submitted to the compiler and the database request module (DBRM) that is input to the bind process. predicate. An element of a search condition that expresses or implies a comparison operation. prefix. A code at the beginning of a message or record. primary authorization ID. The authorization ID used to identify the application process to DB2. primary index. An index that enforces the uniqueness of a primary key. primary key. In a relational database, a unique, nonnull key that is part of the definition of a table. A table cannot be defined as a parent unless it has a unique key or primary key. principal. An entity that can communicate securely with another entity. In Kerberos, principals are represented as entries in the Kerberos registry database and include users, servers, computers, and others. principal name. The name by which a principal is known to the DCE security services. private connection. A communications connection that is specific to DB2. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 109 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar private protocol access. A method of accessing distributed data by which you can direct a query to another DB2 system. Contrast with DRDA access. private protocol connection. A DB2 private connection of the application process. See also private connection. privilege. The capability of performing a specific function, sometimes on a specific object. The term includes: explicit privileges, which have names and are held as the result of SQL GRANT and REVOKE statements. For example, the SELECT privilege. implicit privileges, which accompany the ownership of an object, such as the privilege to drop a synonym one owns, or the holding of an authority, such as the privilege of SYSADM authority to terminate any utility job. privilege set. For the installation SYSADM ID, the set of all possible privileges. For any other authorization ID, the set of all privileges that are recorded for that ID in the DB2 catalog. process. In DB2, the unit to which DB2 allocates resources and locks. Sometimes called an application process, a process involves the execution of one or more programs. The execution of an SQL statement is always associated with some process. The means of initiating and terminating a process are dependent on the environment. program. A single compilable collection of executable statements in a programming language. program temporary fix (PTF). A solution or bypass of a problem that is diagnosed as a result of a defect in a current unaltered release of a licensed program. An authorized program analysis report (APAR) fix is corrective service for an existing problem. A PTF is preventive service for problems that might be encountered by other users of the product. A PTF is temporary, because a permanent fix is usually not incorporated into the product until its next release. protected conversation. A VTAM conversation that supports two-phase commit flows. PTF. Program temporary fix. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 110 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar Q QMF. Query Management Facility. QSAM. Queued sequential access method. query block. The part of a query that is represented by one of the FROM clauses. Each FROM clause can have multiple query blocks, depending on DB2’s internal processing of the query. query CP parallelism. Parallel execution of a single query, which is accomplished by using multiple tasks. See also Sysplex query parallelism. query I/O parallelism. Parallel access of data, which is accomplished by triggering multiple I/O requests within a single query. queued sequential access method (QSAM). An extended version of the basic sequential access method (BSAM). When this method is used, a queue of data blocks is formed. Input data blocks await processing, and output data blocks await transfer to auxiliary storage or to an output device. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 111 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar R RACF. Resource Access Control Facility, which is a component of the SecureWay Security Server for OS/390. RAMAC. IBM family of enterprise disk storage system products. RBA. Relative byte address. RCT. Resource control table (in CICS attachment facility). RDB. Relational database. RDBMS. Relational database management system. RDBNAM. Relational database name. RDF. Record definition field. read stability (RS). An isolation level that is similar to repeatable read but does not completely isolate an application process from all other concurrently executing application processes. Under level RS, an application that issues the same query more than once might read additional rows that were inserted and committed by a concurrently executing application process. rebind. The creation of a new application plan for an application program that has been bound previously. If, for example, you have added an index for a table that your application accesses, you must rebind the application in order to take advantage of that index. record. The storage representation of a row or other data. record identifier (RID). A unique identifier that DB2 uses internally to identify a row of data in a table stored as a record. Compare with row ID. record identifier (RID) pool. An area of main storage above the 16-MB line that is reserved for sorting record identifiers during list prefetch processing. recovery. The process of rebuilding databases after a system failure. recovery log. A collection of records that describes the events that occur during DB2 execution and indicates their sequence. The recorded information is used for recovery in the event of a failure during DB2 execution. recovery pending (RECP). A condition that prevents SQL access to a table space that needs to be recovered. recovery token. An identifier for an element that is used in recovery (for example, NID or URID). RECP. Recovery pending. redo. A state of a unit of recovery that indicates that changes are to be reapplied to the DASD media to ensure data integrity. referential constraint. The requirement that nonnull values of a designated foreign key are valid only if they equal values of the primary key of a designated table. referential integrity. The state of a database in which all values of all foreign keys are valid. Maintaining referential integrity requires the enforcement of referential constraints on all operations that change the data in a table upon which the referential constraints are defined. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 112 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar referential structure. A set of tables and relationships that includes at least one table and, for every table in the set, all the relationships in which that table participates and all the tables to which it is related. registry. See registry database. registry database. A database of security information about principals, groups, organizations, accounts, and security policies. relational database (RDB). A database that can be perceived as a set of tables and manipulated in accordance with the relational model of data. relational database management system (RDBMS). A collection of hardware and software that organizes and provides access to a relational database. relational database name (RDBNAM). A unique identifier for an RDBMS within a network. In DB2, this must be the value in the LOCATION column of table SYSIBM.LOCATIONS in the CDB. DB2 publications refer to the name of another RDBMS as a LOCATION value or a location name. relationship. A defined connection between the rows of a table or the rows of two tables. A relationship is the internal representation of a referential constraint. relative byte address (RBA). The offset of a data record or control interval from the beginning of the storage space that is allocated to the data set or file to which it belongs. remigration. The process of returning to a current release of DB2 following a fallback to a previous release. This procedure constitutes another migration process. remote attach request. A request by a remote location to attach to the local DB2 subsystem. Specifically, the request that is sent is an SNA Function Management Header 5. remote subsystem. Any RDBMS, except the local subsystem, with which the user or application can communicate. The subsystem need not be remote in any physical sense, and might even operate on the same processor under the same MVS system. reoptimization. The DB2 process of reconsidering the access path of an SQL statement at run time; during reoptimization, DB2 uses the values of host variables, parameter markers, or special registers. REORG pending (REORP). A condition that restricts SQL access and most utility access to an object that must be reorganized. REORP. REORG pending. repeatable read (RR). The isolation level that provides maximum protection from other executing application programs. When an application program executes with repeatable read protection, rows referenced by the program cannot be changed by other programs until the program reaches a commit point. request commit. The vote that is submitted to the prepare phase if the participant has modified data and is prepared to commit or roll back. requester. The source of a request to access data at a remote server. In the DB2 environment, the requester function is provided by the distributed data facility. resource allocation. The part of plan allocation that deals specifically with the database resources. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 113 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar resource control table (RCT). A construct of the CICS attachment facility, created by site-provided macro parameters, that defines authorization and access attributes for transactions or transaction groups. resource definition online. A CICS feature that you use to define CICS resources online without assembling tables. A portion of DB2 code that prevents dynamic manipulative SQL statements from exceeding specified time limits. The resource limit facility is sometimes called the governor. resource limit facility (RLF). resource limit specification table. A site-defined table that specifies the limits to be enforced by the resource limit facility. restart pending (RESTP). A restrictive state of a page set or partition that indicates that restart (backout) work needs to be performed on the object. All access to the page set or partition is denied except for access by the: v RECOVER POSTPONED command v Automatic online backout (which DB2 invokes after restart if the system parameter LBACKOUT=AUTO) result table. The set of rows that are specified by a SELECT statement. RID. Record identifier. RID pool. Record identifier pool. right outer join. The result of a join operation that includes the matched rows of both tables that are being joined and preserves the unmatched rows of the second join operand. See also join. RLF. Resource limit facility. RMID. Resource manager identifier. RO. Read-only access. rollback. The process of restoring data changed by SQL statements to the state at its last commit point. All locks are freed. Contrast with commit. root page. The page of an index page set that follows the first index space map page. A root page is the highest level (or the beginning point) of the index. routine. A term that refers to either a user-defined function or a stored procedure. row. The horizontal component of a table. A row consists of a sequence of values, one for each column of the table. ROWID. Row identifier. row identifier (ROWID). A value that uniquely identifies a row. This value is stored with the row and never changes. row lock. A lock on a single row of data. RRE. Residual recovery entry (in IMS). RRSAF. Recoverable Resource Manager Services attachment facility. RRSAF is a DB2 subcomponent that uses OS/390 Transaction Management and Recoverable Resource Manager Services to coordinate resource commitment between DB2 and all other resource managers that also use OS/390 RRS in an OS/390 system. RS. Read stability. RTT. Resource translation table. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 114 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar S savepoint. A named entity that represents the state of data and schemas at a particular point in time within a unit of work. SQL statements exist to set a savepoint, release a savepoint, and restore data and schemas to the state that the savepoint represents. The restoration of data and schemas to a savepoint is usually referred to as rolling back to a savepoint. scalar function. An SQL operation that produces a single value from another value and is expressed as a function name, followed by a list of arguments that are enclosed in parentheses. Contrast with column function. schema. A logical grouping for user-defined functions, distinct types, triggers, and stored procedures. When an object of one of these types is created, it is assigned to one schema, which is determined by the name of the object. For example, the following statement creates a distinct type T in schema C: CREATEDISTINCT TYPEC.T ... SDWA. S ystem diagnostic work area. search condition. A criterion for selecting rows from a table. A search condition consists of one or more predicates. secondary authorization ID. An authorization ID that has been associated with a primary authorization ID by an authorization exit routine. section. The segment of a plan or package that contains the executable structures for a single SQL statement. For most SQL statements, one section in the plan exists for each SQL statement in the source program. However, for cursor-related statements, the DECLARE, OPEN, FETCH, and CLOSE statements reference the same section because, they each refer to the SELECT statement that is named in the DECLARE CURSOR statement. SQL statements such as COMMIT, ROLLBACK, and some SET statements do not use a section. segmented table space. A table space that is divided into equal-sized groups of pages called segments. Segments are assigned to tables so that rows of different tables are never stored in the same segment. self-referencing constraint. A referential constraint that defines a relationship in which a table is a dependent of itself. self-referencing table. A table with a self-referencing constraint. sequential data set. A non-DB2 data set whose records are organized on the basis of their successive physical positions, such as on magnetic tape. Several of the DB2 database utilities require sequential data sets. sequential prefetch. A mechanism that triggers consecutive asynchronous I/O operations. Pages are fetched before they are required, and several pages are read with a single I/O operation. server. The target of a request from a remote requester. In the DB2 environment, the server function is provided by the distributed data facility, which is used to access DB2 data from remote applications. service class. An eight-character identifier that is used by MVS Workload Manager to associate customer performance goals with a particular DDF thread or stored procedure. A service class is also used to classify work on parallelism assistants. session. A link between two nodes in a VTAM network. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 115 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar session protocols. The available set of SNA communication requests and responses. share lock. A lock that prevents concurrently executing application processes from changing data, but not from reading data. Contrast with exclusive lock. short string. A string whose actual length, or a varying-length string whose maximum length, is 255 bytes (or 127 double-byte characters) or less. Regardless of length, a LOB string is not a short string. sign-on. A request that is made on behalf of an individual CICS or IMS application process by an attachment facility to enable DB2 to verify that it is authorized to use DB2 resources. simple page set. A nonpartitioned page set. A simple page set initially consists of a single data set (page set piece). If and when that data set is extended to 2 GB, another data set is created, and so on up to a total of 32 data sets. DB2 considers the data sets to be a single contiguous linear address space containing a maximum of 64 GB. Data is stored in the next available location within this address space without regard to any partitioning scheme. simple table space. A table space that is neither partitioned nor segmented. single-byte character set (SBCS). A set of characters in which each character is represented by a single byte. Contrast with double-byte character set or multibyte character set. SMF. System management facility. SMP/E. System Modification Program/Extended. SMS. Storage Management Subsystem. SNA. Systems Network Architecture. SNA network. T he part of a network that conforms to the formats and protocols of Systems Network Architecture (SNA). sourced function. A function that is implemented by another built-in or user-defined function that is already known to the database manager. This function can be a scalar function or a column (aggregating) function; it returns a single value from a set of values (for example, MAX or AVG). Contrast with built-in function, external function, and SQL function. special register. A storage area that DB2 defines for an application process to use for storing information that can be referenced in SQL statements. Examples of special registers are USER and CURRENT DATE. SPUFI. SQL Processor Using File Input. SQL. Structured Query Language. SQL authorization ID (SQL ID). The authorization ID that is used for checking dynamic SQL statements in some situations. SQLCA. SQL communication area. SQL communication area (SQLCA). A structure that is used to provide an application program with information about the execution of its SQL statements. SQLDA. SQL descriptor area. SQL descriptor area (SQLDA). A structure that describes input variables, output variables, or the columns of a result table. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 116 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar SQL/DS. Structured Query Language/Data System. This product is now obsolete and has been replaced by DB2/UDB for VSE & VM. SQL function. A user-defined function in which the CREATE FUNCTION statement contains the source code. The source code is a single SQL expression that evaluates to a single value. The SQL user-defined function can return only one parameter. SQL processing conversation. Any conversation that requires access of DB2 data, either through an application or by dynamic query requests. SQL Processor Using File Input (SPUFI). SQL Processor Using File Input. A facility of the TSO attachment subcomponent that enables the DB2I user to execute SQL statements without embedding them in an application program. SQL routine. A user-defined function or stored procedure that is based on code that is written in SQL. SSI. Subsystem interface (in MVS). SSM. Subsystem member. stand-alone. An attribute of a program that means it is capable of executing separately from DB2, without using DB2 services. star join. A method of joining a dimension column of a fact table to the key column of the corresponding dimension table. See also join, dimension, and star schema. star schema. The combination of a fact table (which contains most of the data) and a number of dimension tables. See also star join, dimension, and dimension table. For a dynamic SQL statement, the character string form of the statement. statement string. static SQL. SQL statements, embedded within a program, that are prepared during the program preparation process (before the program is executed). After being prepared, the SQL statement does not change (although values of host variables that are specified by the statement might change). storage group. A named set of disks on which DB2 data can be stored. stored procedure. A user-written application program that can be invoked through the use of the SQL CALL statement. string. See character string or graphic string. Structured Query Language (SQL). A standardized language for defining and manipulating data in a relational database. subcomponent. A group of closely related DB2 modules that work together to provide a general function. subpage. The unit into which a physical index page can be divided. subquery. A SELECT statement within the WHERE or HAVING clause of another SQL statement; a nested SQL statement. subselect. That form of a query that does not include ORDER BY clause, UPDATE clause, or UNION operators. subsystem. A distinct instance of a relational database management system (RDBMS). © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 117 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar sync point. See commit point. synonym. In SQL, an alternative name for a table or view. Synonyms can be used only to refer to objects at the subsystem in which the synonym is defined. Sysplex. See Parallel Sysplex. Sysplex query parallelism. Parallel execution of a single query that is accomplished by using multiple tasks on more than one DB2 subsystem. See also query CP parallelism. system administrator. The person at a computer installation who designs, controls, and manages the use of the computer system. system agent. A work request that DB2 creates internally such as prefetch processing, deferred writes, and service tasks. system conversation. The conversation that two DB2 subsystems must establish to process system messages before any distributed processing can begin. system diagnostic work area (SDWA). The data that is recorded in a SYS1.LOGREC entry that describes a program or hardware error. system-directed connection. A connection that an RDBMS manages by processing SQL statements with three-part names. System Modification Program/Extended (SMP/E). A tool for making software changes in programming systems (such as DB2) and for controlling those changes. Systems Network Architecture (SNA). The description of the logical structure, formats, protocols, and operational sequences for transmitting information through and controlling the configuration and operation of networks. SYS1.DUMPxx data set. A data set that contains a system dump. SYS1.LOGREC. A service aid that contains important information about program and hardware errors. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 118 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar T table. A named data object consisting of a specific number of columns and some number of unordered rows. See also base table or temporary table. table check constraint. A user-defined constraint that specifies the values that specific columns of a base table can contain. table function. A function that receives a set of arguments and returns a table to the SQL statement that references the function. A table function can be referenced only in the FROM clause of a subselect. table space. A page set that is used to store the records in one or more tables. table space set. A set of table spaces and partitions that should be recovered together for one of these reasons: v Each of them contains a table that is a parent or descendent of a table in one of the others. v The set contains a base table and associated auxiliary tables. A table space set can contain both types of relationships. task control block (TCB). A control block that is used to communicate information about tasks within an address space that are connected to DB2. An address space can support many task connections (as many as one per task), but only one address space connection. See also address space connection. TB. Terabyte (1 099 511 627 776 bytes). TCB. Task control block (in MVS). temporary table. A table that holds temporary data; for example, temporary tables are useful for holding or sorting intermediate results from queries that contain a large number of rows. The two kinds of temporary table, which are created by different SQL statements, are the created temporary table and the declared temporary table. Contrast with result table. See also created temporary table and declared temporary table. thread. The DB2 structure that describes an application’s connection, traces its progress, processes resource functions, and delimits its accessibility to DB2 resources and services. Most DB2 functions execute under a thread structure. See also allied thread and database access thread. three-part name. The full name of a table, view, or alias. It consists of a location name, authorization ID, and an object name, separated by a period. time. A three-part value that designates a time of day in hours, minutes, and seconds. time duration. A decimal integer that represents a number of hours, minutes, and seconds. timeout. Abnormal termination of either the DB2 subsystem or of an application because of the unavailability of resources. Installation specifications are set to determine both the amount of time DB2 is to wait for IRLM services after starting, and the amount of time IRLM is to wait if a resource that an application requests is unavailable. If either of these time specifications is exceeded, a timeout is declared. Time-Sharing Option (TSO). An option in MVS that provides interactive time sharing from remote terminals. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 119 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar timestamp. A seven-part value that consists of a date and time. The timestamp is expressed in years, months, days, hours, minutes, seconds, and microseconds. TMP. Terminal Monitor Program. to-do. A state of a unit of recovery that indicates that the unit of recovery’s changes to recoverable DB2 resources are indoubt and must either be applied to the DASD media or backed out, as determined by the commit coordinator. trace. A DB2 facility that provides the ability to monitor and collect DB2 monitoring, auditing, performance, accounting, statistics, and serviceability (global) data. TSO. Time-Sharing Option. TSO attachment facility. A DB2 facility consisting of the DSN command processor and DB2I. Applications that are not written for the CICS or IMS environments can run under the TSO attachment facility. type 1 indexes. Indexes that were created by a release of DB2 before DB2 Version 4 or that are specified as type 1 indexes in Version 4. Contrast with type 2 indexes. As of Version 7, type 1 indexes are no longer supported. type 2 indexes. Indexes that are created on a release of DB2 after Version 6 or that are specified as type 2 indexes in Version 4 or later. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 120 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar U UDF. User-defined function. UDT. User-defined data type. In DB2 for OS/390 and z/OS, the term distinct type is used instead of user-defined data type. See distinct type. uncommitted read (UR). The isolation level that allows an application to read uncommitted data. undo. A state of a unit of recovery that indicates that the changes the unit of recovery made to recoverable DB2 resources must be backed out. Unicode. A standard that parallels the ISO-10646 standard. Several implementations of the Unicode standard exist, all of which have the ability to represent a large percentage of the characters contained in the many scripts that are used throughout the world. union. An SQL operation that combines the results of two select statements. Unions are often used to merge lists of values that are obtained from several tables. unique constraint. An SQL rule that no two values in a primary key, or in the key of a unique index, can be the same. unique index. An index which ensures that no identical key values are stored in a table. unlock. The act of releasing an object or system resource that was previously locked and returning it to general availability within DB2. UR. Uncommitted read. URE. Unit of recovery element. URID (unit of recovery ID). The LOGRBA of the first log record for a unit of recovery. The URID also appears in all subsequent log records for that unit of recovery. user-defined data type (UDT). See distinct type. user-defined function (UDF). A function that is defined to DB2 by using the CREATE FUNCTION statement and that can be referenced thereafter in SQL statements. A user-defined function can be an external function, a sourced function, or an SQL function. Contrast with built-in function. UT. Utility-only access. © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 121 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar V value. The smallest unit of data that is manipulated in SQL. varying-length string. A character or graphic string whose length varies within set limits. Contrast with fixed-length string. version. A member of a set of similar programs, DBRMs, packages, or LOBs. A version of a program is the source code that is produced by precompiling the program. The program version is identified by the program name and a timestamp (consistency token). A version of a DBRM is the DBRM that is produced by precompiling a program. The DBRM version is identified by the same program name and timestamp as a corresponding program version. A version of a package is the result of binding a DBRM within a particular database system. The package version is identified by the same program name and consistency token as the DBRM. A version of a LOB is a copy of a LOB value at a point in time. The version number for a LOB is stored in the auxiliary index entry for the LOB. view. An alternative representation of data from one or more tables. A view can include all or some of the columns that are contained in tables on which it is defined. Virtual Storage Access Method (VSAM). An access method for direct or sequential processing of fixed- and varying-length records on direct access devices. The records in a VSAM data set or file can be organized in logical sequence by a key field (key sequence), in the physical sequence in which they are written on the data set or file (entry-sequence), or by relative-record number. Virtual Telecommunications Access Method (VTAM). An IBM licensed program that controls communication and the flow of data in an SNA network. VSAM. Virtual storage access method. VTAM. Virtual Telecommunication Access Method (in MVS). © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 122 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Glossar W WLM application environment. An MVS Workload Manager attribute that is associated with one or more stored procedures. The WLM application environment determines the address space in which a given DB2 stored procedure runs. write to operator (WTO). An optional user-coded service that allows a message to be written to the system console operator informing the operator of errors and unusual system conditions that may need to be corrected. WTO. Write to operator. WTOR. Write to operator (WTO) with reply. X XMS Cross memory Service XRF. Extended recovery facility. Z z/OS. © S.K. Consulting Services An operating system for the eServer product line that supports 64-bit real storage. ++49 8106 994390 www.sk-consulting.de Seite 123 von 127 DB2-Optimierung und SQL-Performance 11.6 Kapitel 11: Anhang – Literaturhinweis Literaturhinweise DB2 Universal Database Server for OS/390 und z/OS Version 7 “product libraries”: DB2 for OS/390 and z/OS v DB2 Administration Guide, SC26-9931 v DB2 Application Programming and SQL Guide, SC26-9933 v DB2 Application Programming Guide and Reference for Java, SC26-9932 v DB2 Command Reference, SC26-9934 v DB2 Data Sharing: Planning and Administration, SC26-9935 v DB2 Data Sharing Quick Reference Card, SX26-3846 v DB2 Diagnosis Guide and Reference, LY37-3740 v DB2 Diagnostic Quick Reference Card, LY37-3741 v DB2 Image, Audio, and Video Extenders Administration and Programming, SC26-9947 v DB2 Installation Guide, GC26-9936 v DB2 Licensed Program Specifications, GC26-9938 v DB2 Messages and Codes, GC26-9940 v DB2 ODBC Guide and Reference, SC26-9941 v DB2 Reference for Remote DRDA Requesters and Servers, SC26-9942 v DB2 Reference Summary, SX26-3847 v DB2 Release Planning Guide, SC26-9943 v DB2 SQL Reference, SC26-9944 v DB2 Text Extender Administration and Programming, SC26-9948 v DB2 Utility Guide and Reference, SC26-9945 v DB2 What's New? GC26-9946 v DB2 XML Extender for OS/390 and z/OS Administration and Programming, SC27-9949 v DB2 Program Directory, GI10-8182 DB2 Administration Tool v DB2 Administration Tool for OS/390 and z/OS User’s Guide, SC26-9847 DB2 Buffer Pool Tool v DB2 Buffer Pool Tool for OS/390 and z/OS User’s Guide and Reference, SC26-9306 Net.Data ® v Net.Data Library: Administration and Programming Guide for OS/390 and z/OS v Net.Data Library: Language Environment Interface Reference v Net.Data Library: Messages and Codes v Net.Data Library: Reference DB2 PM for OS/390 v DB2 PM for OS/390 Batch User's Guide, SC27-0857 v DB2 PM for OS/390 Command Reference, SC27-0855 v DB2 PM for OS/390 General Information, GC27-0852 v DB2 PM for OS/390 Installation and Customization, SC27-0860 v DB2 PM for OS/390 Messages, SC27-0856 v DB2 PM for OS/390 Online Monitor User's Guide, SC27-0858 v DB2 PM for OS/390 Report Reference Volume 1, SC27-0853 v DB2 PM for OS/390 Report Reference Volume 2, SC27-0854 v DB2 PM for OS/390 Using the Workstation Online Monitor, SC27-0859 v DB2 PM for OS/390 Program Directory, GI10-8223 Query Management Facility (QMF ™ ) v Query Management Facility: Developing QMF Applications, SC26-9579 v Query Management Facility: Getting Started with QMF on Windows, SC26-9582 v Query Management Facility: High Peformance Option User’s Guide for OS/390 and z/OS, SC26-9581 v Query Management Facility: Installing and Managing QMF on OS/390 and z/OS, GC269575 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 124 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Literaturhinweis CICS Transaction Server for OS/390 v CICS Application Programming Guide, SC33-1687 v CICS External Interfaces Guide, SC33-1703 v CICS DB2 Guide, SC33-1939 v CICS Resource Definition Guide, SC33-1684 Data Facility Data Set Services v Data Facility Data Set Services: User's Guide and Reference, SC26-4388 Database Design v DB2 Design and Development Guide by Gabrielle Wiorkowski and David Kull, Addison Wesley, ISBN 0-20158-049-7 v Handbook of Relational Database Design by C. Fleming and B. Von Halle, Addison Wesley, ISBN 0-20111-434-8 v DB2 DB Design und physische Strukturen, Sepp Kraus, S.K. Consulting Services GmbH DB2 Connect ® v DB2 Connect Enterprise Edition for OS/2 and Windows: Quick Beginnings, GC09-2953 v DB2 Connect Enterprise Edition for UNIX: Quick Beginnings, GC09-2952 v DB2 Connect Personal Edition Quick Beginnings, GC09-2967 v DB2 Connect User's Guide, SC09-2954 DB2 Red Books v DB2 UDB Server for OS/390 Version 6 Technical Update, SG24-6108-00 v DB2 for z/OS and OS/390 Version 7: Using the Utilities Suite, SG24-6289 v DB2 UDB Server for OS/390 and z/OS Version 7 Presentation Guide, SG24-6121 v DB2 Java Stored Procedures -- Learning by Example, SG24-5945 v DB2 UDB for OS/390 Version 7 Performance Topics, SG24-5351 v DB2 for OS/390 Capacity Planning, SG24-2244 v DB2 for OS/390 and Continuous Availability, SG24-5486 v Parallel Sysplex Configuration: Cookbook, SG24-2076-00 v DB2 for OS390 Application Design for High Performance, GG24-2233 v Storage Management with DB2 for OS/390, SG24-5462 DB2 Universal Database for UNIX, Windows, OS/2 v DB2 UDB Administration Guide: Planning, SC09-2946 v DB2 UDB Administration Guide: Implementation, SC09-2944 v DB2 UDB Administration Guide: Performance, SC09-2945 v DB2 UDB Administrative API Reference, SC09-2947 v DB2 UDB Application Building Guide, SC09-2948 v DB2 UDB Application Development Guide, SC09-2949 v DB2 UDB CLI Guide and Reference, SC09-2950 v DB2 UDB SQL Getting Started, SC09-2973 v DB2 UDB SQL Reference Volume 1, SC09-2974 v DB2 UDB SQL Reference Volume 2, SC09-2975 Distributed Relational Database Architecture ™ v Data Stream and OPA Reference, SC31-6806 v IBM SQL Reference, SC26-8416 v Open Group Technical Standard v DRDA Version 2 Vol. 1: Distributed Relational Database Architecture (DRDA) v DRDA Version 2 Vol. 2: Formatted Data Object Content Architecture v DRDA Version 2 Vol. 3: Distributed Data Management Architecture Parallel Sysplex ® Library v OS/390 Parallel Sysplex Application Migration, GC28-1863 v System/390 MVS Sysplex Hardware and Software Migration, GC28-1862 v OS/390 Parallel Sysplex Overview: An Introduction to Data Sharing and Parallelism, GC28-1860 v OS/390 Parallel Sysplex Systems Management, GC28-1861 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 125 von 127 DB2-Optimierung und SQL-Performance Kapitel 11: Anhang – Literaturhinweis v OS/390 Parallel Sysplex Test Report, GC28-1963 Storage Management v DFSMS/MVS Storage Management Library: Implementing System-Managed Storage, SC26-3123 v MVS/ESA Storage Management Library: Leading a Storage Administration Group, SC26-3126 v MVS/ESA Storage Management Library: Managing Data, SC26-3124 v MVS/ESA Storage Management Library: Managing Storage Groups, SC26-3125 System/370 ™ and System/390 ® v ESA/370 Principles of Operation, SA22-7200 v ESA/390 Principles of Operation, SA22-7201 v System/390 MVS Sysplex Hardware and Software Migration, GC28-1210 © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 126 von 127 DB2-Optimierung und SQL-Performance Kapitel 3: SQL – Die „Structured Query Language“ bei DB2 ENDE © S.K. Consulting Services ++49 8106 994390 www.sk-consulting.de Seite 127 von 127