(*) IBM DB2 for z/OS DB2 Version 9 - Anwendungsentwicklung (DB2_V9_DEVnews.ppt) (*) ist eingetragenes Warenzeichen der IBM International Business Machines Inc. Januar, 2010 1 DB2 Version 9 (AE) DB2 V9 –Erweiterungen für die Anwendungsentwicklung Neuerungen in den Statistiken (Histogramme) „optimistic concurrency control & update“ INSTEADOF Trigger Automatisches Erzeugen eines Objekts Index „on expression“ „cultural sort & case insensitive comparison“ „skip locked rows“ FETCH CONTINUE Spatial Support XML (eig. Kapitel) LOB „File reference variable“ & FETCH CONTINUE Native SQL Procedure Language Neue Spezialregister CURRENT SCHEMA „unified debugger“ (OSC) Januar, 2010 2 DB2 Version 9 (AE) DB2 V9 – Verbesserung am RUNSTATS (Histogramm Statistiken) • • • • Sinnvoll für “nicht gleichverteilte” Werte mit hoher “cardinality” “Histogram statistics” zielen auf Querverweise von Datenwerten Summiert die Datenverteilung auf Intervall-Ebene DB2 nutzt „equal-depth“ Histogramme Jedes Quantil betrifft annähernd dieselbe Anzahl “rows” Beispiel - 1, 3, 3, 4, 4, 6, 7, 8, 9, 10, 12, 15 (in Folge), geplittet in 3 Quantile RUNSTATS • Kann maximal 100 Quantile für eine Spalte anlegen • Gleiche Werte in einer Spalte BEDEUTEN auch immer Zuordnung zum selben Quantil • Quantile werden aufsummiert, aber: DB2 versucht möglichst wenige Quantile zu erzeugen und dabei große “gaps” zu vermeiden Ein “high-” und ein “low-value” Wert einer Spalte kann in separaten Quantilen abgelegt werden NULL wird immer einem eigenen Quantil zugeordnet • Existieren weniger als 100 Spaltenwerte, so wird auf verteilte Statistiken zurückgesetzt • Dieses “feature” wird nicht von LOAD bzw. REORG unterstützt • Unterstützt “column groups” ebenso, wie einzelne Spalten Januar, 2010 3 DB2 Version 9 (AE) DB2 V9 – Verbesserung am RUNSTATS Histogramm Statistiken) Beispiel: YRS_OF_EXPERIENCE Spalte in der Tabelle EMPLOYEE Range Prädikat: SELECT T.EMPID FROM EMPLOYEE T WHERE T.YRS_OF_EXPERIENCE BETWEEN 5 AND 10; Non-local Prädikat: SELECT T1.EMPID FROM EMPLOYEE T1, OPENJOBS T2 WHERE T1.SPECIALTY = T2.AREA AND T1.YRS_OF_EXPERIENCE > T2.YRS_OF_EXPERIENCE; Die Histohramm-Statistiken dazu: Januar, 2010 4 DB2 Version 9 (AE) DB2 V9 – Verbesserung am RUNSTATS (Histogramm Statistiken) DB2 erzeugt “histogram statistics” in gleicher/vergleichbarer “Tiefe”- heisst, dass es die gesamte Menge aller Wertevorkommen in Intervalle unterteilt, in denen jedes denselben prozentualen Anteil aller “rows” enthält. Diese “histogram statistics intervals” besitzen folgende Eigenschaften: • Jedes Intervall umfasst annähernd dieselbe Anzahl, bzw. denselben prozentualen Anteil an “rows”. Ein hochfrequenter “Einzelwert” kann ein Intervall alleine für sich beanspruchen. • Ein Einzelwert wird niemals in mehr als EINEM Intervall vorkommen. Das heisst, die maximale Anzahl von Intervallen ist identisch mit der Anzahl der ”distinct values” der entsprechenden Spalte. Diese maximale Anzhal der Intervalle kann niemals den Wert 100 überschreiten. Dies ist die maximale Anzahl von Intervallen, die DB2 unterstützt. • Angrenzende Intervalle übergehen manchmal Werte, die nicht in der Tabelle vorkommen, insbesonders dann, wenn dies dazu führt, sich eine grosse Menge “fehlender” Werte innerhalb des Intervalls zu sparen. Beispiel: Ein Wert 30 (wie oben gezeigt) habe die “frequency” 1%. Wenn man ihn im siebten Intervall platziert, so wird das die Prozentsätze im sechsten und siebten Intervall ausbalancieren. Andererseit wird damit eine grosse “skipped range” zum siebten Intervall aufgetan. • HIGHVALUE und LOWVALUE können sowohl “inklusiv” als auch als “exklusiv” gehandhabt werden. Ein Intervall repräsentiert jedoch in der Regel eine “non-overlapped value range”. Januar, 2010 5 DB2 Version 9 (AE) DB2 V9 –Histogramm Statistiken (cntnd.) • • • NULL Werte, falls welche existieren, belegen ein eigenes Intervall. Da DB2 einzelne Werte nicht in zwei unterschiedlichen Intervallen platzieren kann, wurde die maximale Anzahl Intervalle auf die maximal mögliche Anzahl unterschiedlicher Werte in der Spalte begrenzt- kann aber bei DB2 niemals die Intervallanzahl von 100 überschreiten. “Histogram statistics” sind hilfreich, wenn in (math. / Vergleichs-) Reihen entsprechende Lücken klaffen. Beispiel 1: Man nutzt INTEGER (oder schlimmer noch: VARCHAR) zur Darstellung von YEAR-MONTH Daten • Der Optimizer kann nicht erkennen, dass es zwischen 200512 und 200601 keine (gültigen) Werte gibt. Denn 200513 bis 200600 sind zwar gültige numerische Werte, aber keine gültigen Monats- und Jahreswerte • Der Optimizer trifft folgende Annahme: BETWEEN 200512 AND 200601 90 gültige Werte, aber nur 2 gültige Datumswerte • Das liefert mehr „rows“ als BETWEEN 200501 AND 200512 12 gültige Werte und 12 gültige Datumswerte • Mit Histogrammstatistiken kann die „Anzahl“ von diversen Datenwerten dargestellt werden Das erlaubt eine genauere Schätzung für die Filterfaktoren Januar, 2010 6 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „optimistic locking“ Fetch row1 Lock row1 Unlock row1 Fetch row2 Lock row2 Unlock row2 UPDATE WHERE CURRENT OF… Lock row2 Compare by VALUE UPDATE row2 If values match Will die Applikation eine FETCH Operation ausführen, um den CURSOR auf eine bestimmte Row zu positionieren, so führt DB2 folgende Schritte durch: a. Lock der Row b. Ausführen des FETCH c. Freigabe (Release) des Lock Bei einem „positioned update / delete“ auf der Row passiert folgendes: a. Lock der Row b. Neu-Evaluation der Prädikate, um sicherzustellen, dass die Row immer noch zur Resultatstabelle gehört Januar, 2010 7 DB2 Version 9 (AE) DB2 V9 – Erweiterungen („optimistic locking“) Built-in timestamp für jede Row oder Page • Automatischer Update von DB2 • Timestamp Prädikat ermöglicht die Prüfung ob die Row geändert wurde CREATE TABLE EMP_INFO ( EMPNO CHAR(6)NOT NULL, EMP_INFOCHANGE EMP_ADDRESS EMP_PHONENO PRIMARY KEY (EMPNO) NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP, VARCHAR(300), CHAR(4), ) Suche alle Änderungen innerhalb der letzten 30 Tage vin der Tabelle EMP_INFO SELECT * WHERE AND Januar, 2010 FROM EMP_INFO ROW CHANGE TIMESTAMP FOR EMP_INFO <= CURRENT TIMESTAMP ROW CHANGE TIMESTAMP FOR EMP_INFO >= CURRENT TIMESTAMP - 30 days 8 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „optimistic locking“ SELECT C1, ROW CHANGE TOKEN FOR TAB, RID(TAB) INTO :h1, :h_rct. :h_rid FROM TAB WHERE TAB.C1 = 10 …… UPDATE TAB SET TAB.C2 = 10 WHERE RID(TAB) = :h_rid ROW CHANGE TOKEN FOR TAB = :h_rct Januar, 2010 9 DB2 Version 9 (AE) DB2 V9 – INSTEADOF Trigger • Heute werden Views häufig zur Kontrolle von lesenden Zugriffen eingesetzt Viele Views sind also “not updatable” das heisst Kontrolle der Zgriffe auf die Basistabellen für Insert, Update und Delete Triggers können zu “controlled updates” verhelfen • Neuer Triggertyp enthält einen allgemeinen Mechanismus für alle “read / write” Zugriffe Kann nur für Views definiert werden es gibt nur 1 INSTEAD OF INSERT, UPDATE, DELETE pro VIEW Die angeforderte “update” Operation gegen einen View wird von der Trigger-Logik übersteuert damit vollkommen transparent für die Applikation erforderte aber diverse CREATE TABLE WEATHER (CITY VARCHAR(25), TEMPF DECIMAL(5,2)); VIEW CELCIUS_WEATHER (CITY, TEMPC) AS Änderungen CREATE SELECT CITY, (TEMPF-32)*5.00/9.00 FROM WEATHER; in den DB2 CREATE TRIGGER CW_INSERT INSTEAD OF INSERT ON CELCIUS_WEATHER KatalogtaREFERENCING NEW AS NEWCW DEFAULTS NULL FOR EACH ROW MODE DB2SQL bellen (SYSINSERT INTO WEATHER VALUES (NEWCW.CITY, 9.00/5.00 * NEWCW.TEMPC+32); TABLES, CREATE TRIGGER CW_UPDATE INSTEAD OF UPDATE ON CELCIUS_WEATHER SYSREFERENCING NEW AS NEWCW OLD AS OLDCW DEFAULTS NULL TRIGGERS ) FOR EACH ROW MODE DB2SQL UPDATE WEATHER AS W SET W.CITY = NEWCW.CITY, W.TEMPF = 9.00/5.00*NEWCW.TEMPC+32 WHERE W.CITY = OLDCW.CITY; Januar, 2010 10 DB2 Version 9 (AE) DB2 V9 – automatisches Erzeugen von DB-Objekten In DB2 V8, wird, wenn man ein CREATE TABLE Statement ohne Angabe eines TS und einer DB benutzt, von DB2 implizit ein “default TS” in der Datenbank DSNDB04 angelegt. Um das Leben der von DB2 betroffenen Menschen zu erleichtern, bietet DB2 V9 weitere Wege, das Erzeugen von Tabellen und zugehöriger Objekte schneller werrden zu lassen. DB2 V9 besitzt die Fähigkeit folgende Objekte implizit zu erzeugen, abhängig davon, wie man das CREATE TABLE SQL Statement kodiert: • • • • • • Database Tablespace Primary key index Unique key index ROWID index falls die ROWID Spalte als GENERATED BY DEFAULT angelgt ist LOB Tablespace, “auxiliary table”, “auxiliary index” Eigenschaften der automatisch erzeugten Objekte Januar, 2010 11 DB2 Version 9 (AE) DB2 V9 – automatisches Erzeugen von DB-Objekten • Implizite db: DSN00001 – DSN60000 (wrap around) Es gibt diverse neue Bufferpool „zparms“ TBSBPxxx für 4k – 32k, TBSBPXML für XML, TBSBPLOB für LOB IDXBPOOL für Indexe • Implizite ts: Segmented im CM; UTS (“partitioned-by-growth”) im NFM IMPDSDEF zparm: Default für DEFINE Parameter IMPTSCMP zparm: Default für COMPRESS Parameter Define index for primary, unique and ROWID CREATE TABLESPACE ohne IN Klausel nutzt immer noch die DSNDB04….. Januar, 2010 12 DB2 Version 9 (AE) DB2 V9 –Erweiterungen INDEX on <expression> CREATE TABLE employee ( id lastname firstname salary bonus INTEGER NOT NULL, VARCHAR(20) NOT NULL, VARCHAR(20) NOT NULL, DEC(15,2) NOT NULL, FLOAT) Folgender Index: CREATE INDEX ( SELECT WHERE upper_empname ON employee UPPER(lastname, 'EN_US'), UPPER(firstname, 'EN_US'), id ) id FROM employee bonus + salary > 100000 ; CREATE INDEX total_compensation ON employee (salary + bonus) Januar, 2010 13 DB2 Version 9 (AE) DB2 V9 –Erweiterungen INDEX on <expression> Man erzeuge folgenden “unique index”: CREATE UNIQUE INDEX empname ON employee (SUBSTR(firstname,1,1) CONCAT '. ' CONCAT lastname); In jedem Fall wird die EINDEUTIGKEIT des Index gegen die Werte, die letztendlich im Index gespeichert werden, geprüft, nicht gegen die Werte, die in der Tabelle abgelegt sind. In diesem Fall wird DB2 einen “duplicate key” Fehler zurückgeben, auch wenn es so scheinen mag, dass keine doppelten Werte in der Tabelle zu finden sind. Es gibt nämlich bereits den Mitarbeiter Michael Smith. Würde nun die Mitarbeiterin Monica Smith der Tabelle hinzugefügt, so würden beide über den UNIQUE “Index on expression” zum selben IX-Wert führen: M. Smith. Restriktionen: • Jede „key-expression“ muss eine Referenz auf eine Tabellenspalte haben • Alle Tabellenreferenzen müsse unqualifiziert angegeben sein • Referenzierte Spalten können nicht vom Typ LOB, XML, DECFLOAT sein. • Referenzierte Spalten können keine FIELDPROCs oder ein SECURITY LABEL enthalten. • Eine „Key-expression“ darf folgendes NICHT enthalten: „subquery“, „aggregate function“, eine „not deterministic function“, eine Funktion mit einer externen Aktion, eine „user-defined function“, eine Referenz auf eine Sequenz, eine „host variable“, einen „parameter marker“, ein Spezialregister, einen „CASE“-Ausdruck…. usw. Januar, 2010 14 DB2 Version 9 (AE) DB2 V9 –Erweiterungen INDEX on <expression> Überlegungen zu „on index on expression“ Finden von Fehlern auf den Ausdrücken für einen Index Fehler, die während der Evaluation einer “expression” auf einen Index erkannt werden, werden erst in diesem Augenblick zurückgegeben. Das kann sein bei UPDATE, INSERT oder einem DELETE Statement. Auch ein SELECT aus einem DML”data change” Statement, oder Utilities, wie REBUILD INDEX, CREATE INDEX, bzw. REORG TABLESPACE können Fehler erkennen lassen Beispiel: Die Evaluation des Ausdrucks 10 / column_1 liefert einen Fehler, wenn der Wert in column_1 = 0 ist. Der Fehler wird während eines CREATE INDEX geliefert, wenn die Tabelle nicht leer ist und eine “row” mit einem Wert 0 in der Spalte “column_1” enthält. Der Fehler kann auch auftreten, wenn INSERT oder UPDATE durchgeführt werden. Länge eines Resultats einer “expression” bei “string types” Ist der Ergebnisdatentyp einer “key-expression” ein “string type” und die Länge des Resultats kann nicht zur BINDZeit errechnet werden, so wird die Länge auf die maximal erlaubte Länge des entsprechenden Datentyps gesetzt oder auf die größte Länge, die DB2 schätzen kann. In diesem Fall wird ein CREATE INDEX fehlschlagen, da die Gesamtlänge des “key” das Limit eines “index key” überschreitet. Beispiel: Die Länge des Resultats mit folgendem Ausdruck: REPEAT('A', CEIL(1.1)) ist VARCHAR(32767) und die Resultatslänge aus SUBSTR(DESCRIPTION,1,INTEGER(1.2)) sei die Länge der Spalte DESCRIPTION. Hier kann ein CREATE INDEX Statement auf diese Ausdrücke nicht erfolgreich durchgeführt werden, da die “total key length” das Limit für „index keys“ überschreitet. Januar, 2010 15 DB2 Version 9 (AE) DB2 V9 –Erweiterungen „cultural sort & case insensitive comparison“ Diese Änderung betrifft folgende Anforderung: 1. In nationalen Sprachumgebungen, wie Tschechisch, Slovakisch, Ungarisch usw. haben die nationalen Alphabete oft spezielle Buchstaben, die aus zwei “characters” bestehen. Diese werden im aktuellen DB2 nicht richtig sortiert. Beispiel: Im Tschechischen wird der Buchstabe ch als EIN Laut (nicht als 2 Buchstaben) verwendet und wie folgt sortiert: a....b....c.....d.....e.....f.....g.....h, ch, i......j...... Und nicht: a....b....c.....ch.....d..... (wie es z. Zt. Von DB2 als SORT-Ergebnis zurückgegeben wird) Der Buchstabe “ch” sollte also korrekterweise zwischen h und i und nicht zwischen c und d einsortiert werden. Beispielquery: Die folgende Query sortiert nach V4.0.1 (UCA), ignoriert “spaces”, Interpunktuation und Symbole und nutzt dazu die schwedische Alphabetisierung ohne Groß-/Kleinschreibung zu berücksichtigen: SELECT FROM ORDER Januar, 2010 FIRSTNME, LASTNAME DSN8910.EMP BY COLLATION_KEY(LASTNAME, ’UCA400R1_AS_LSV_S2’); 16 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „cultural sort & case insensitive comparison“ 2. Da das Web immer mehr auch in Mainframe Architekturen eingebunden wird und Daten auf unterschiedlichen Plattformen gespeichert werden, sind die “alten” “upper case” Anzeigen bei Geschäfts- und Endbenutzern weniger gefragt . Aus dem“ease-of-use” Standpunkts, will man die Daten im “mixed case” Format sehen. Dies wird zur Herausforderung, wenn die Daten am Host gespeichert und zudem Bestandteil von Query-Prädikaten sind. Um die Query-Effizienz zu maximieren, ist es üblich, alle Daten in “upper case” Format zu speichern. Das lässt Suchen einfach und “indexable” werden. Macht es aber auch schwierig, die Daten dann in ein “mixed” Format zur Anzeige zu “zurück” zu überführen. Suchen auf “mixed case” Daten wiederum ist mehr als problematisch, da ein LIKE-Prädikat und eine “scalar function” erforderlich sind, was einen Zugriffspfad alles andere als optimal werden läßt. Die Verbesserung in DB2 9 macht es möglich, die Daten in “mixed case” Format zu speichern und dann “case insensitive” Suchen durchzuführen, die keien TS Scans verursachen. Beispiel: “Minnesota”, “MINNESOTA” und “minnesota” werden korrekt über Query zurückgegeben ohne etwas fromulieren zu müssen wie: ….like where upper(:hv) = upper(column)… “Cultural sort” ist Bestandteil des verbesserten DB2 “national language support.” DB2 führt dazu eine neue Funktion : COLLATION_KEY ein. Die Funktionen LOWER und UPPER wurden geändert Hier wird die Funktion COLLATION_KEY auf die Spalten LASTNAME und SALES_PERSON angewendet, um die “sort keys” so einzustellen, dass eine korrekter Vergleich möglich wird (Quebec(frz.)): SELECT E.WORKDEPT FROM EMPLOYEE AS E INNER JOIN SALES AS S ON COLLATION_KEY(E.LASTNAME, ’UCA400R1_LFR’) = COLLATION_KEY(S.SALES_PERSON, ’UCA400R1_LFR’) WHERE S.REGION = ’Quebec’; Januar, 2010 17 DB2 Version 9 (AE) DB2 V9 – Erweiterungen CURRENT SCHEMA DB2 V8 führte das Spezialregister CURRENT SCHEMA ein und erlaubte damit auch das Statement SET CURRENT SCHEMA. Die Restriktion in DB2 V8 ist, dass das CREATE Statements nicht erlaubt ist, wenn der Wert von CREATE SCHEMA vom Wert des CURRENT SQLID Spezialregister differiert. DB2 V9 hebt diese Restriktion auf. Für die meisten Objekte ist der CURRENT SCHEMA Wert der Qualifier der dynamisch erzeugten (CREATed) Objekte , für die explizit KEIN Qualifier beim CREATE spezifiziert wurde. CURRENT SQLID bleibt der “object owner”. Januar, 2010 18 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „skip locked rows“ Die Option SKIP LOCKED DATA ermöglicht einer Transaktion die “rows”, die inkompatibel von einer anderen Transaktion gesperrt sind, einfach nicht zu beachten. Neues Schlüsselwort im SELECT, UPDATE, DELETE Statement und UNLOAD Da die Option SKIP LOCKED DATA diese Zeilen einfach übergeht, kann für manche Applikationen die Performance steigen, da die “lock wait time” wegfällt. ABER: Man sollte Option SKIP LOCKED DATA nur für solche Applikationen nutzen, die es auch vertragen, ohne die übergangenen “rows” ein brauchbares Ergebnis präsentieren zu können. Nutzt eine Transaktion die Option SKIP LOCKED DATA, so wird sie die Daten, die über Locks gesperrt sind weder Lesen noch modifizieren. Beispiel: Angenommen, eine Tabelle EXTABLE existiert in einem TS mit “row-level locking” bzw. “page-level locking” und die “rows” verteilen sich über mehrere Pages. EXTABLE besitzt 2 Spalten C1 and C2.mit den Daten: C1 1 2 3 4 C2 AAAA BBBB CCCC DDDD Eine Transaktion setzt nun folgendes UPDATE Statement ab: UPDATE EXTABLE SET C1 = 99 WHERE C1 < 3; Eine andere Transaktion gibt das folgende SELECT Statement, bevor die erste Transaktion „committet“ , an DB2: SELECT COUNT (*) FROM EXTABLE WHERE C2 >= ’AAAA’ SKIP LOCKED DATA; Gibt es nun keinen Index auf C2, liefert DB2 den Wert 2, da DB2 die zwei “rows”, die gesperrt sind , übergeht. Was ist der Unterschied zwischen “uncommitted read” und “skip locked rows” ? Januar, 2010 19 DB2 Version 9 (AE) DB2 V9 – Erweiterungen FETCH CONTINUE Diese Verbesserung erweiteret das FETCH SQL Statement für Applikationen, die LOB bzw. XML Spalten aus tabellen lesen sollen und die Lände dieser LOB/XML Werte nicht bekannt oder so groß ist, dass die Applikation das entsprechende LOB nicht direkt im Speicher abbilden kann. VOR DB2V9 musste ein Programm explizit Speicher zuweisen, um solche LOBs aufnehmen zu können. PROBLEM: “shortage” auf dem “virtual memory” in manchen Umgebungen. Die Erweiterungen zum FETCH Statement diesbezüglich sind die Klausel WITH CONTINUE und CONTINUE. Beispiel – „statisc SQL“: CREATE TABLE T1 (C1 INT, C2 CLOB(100M), C3 CLOB(32K), C4 XML); [1] [2] [3] [4] [5] [6] EXEC SQL BEGIN DECLARE SECTION DECLARE CLOBHV SQL TYPE IS CLOB(32767); EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE CURSOR1 CURSOR FOR SELECT C2 FROM T1; EXEC SQL OPEN CURSOR1; EXEC SQL FETCH WITH CONTINUE CURSOR1 INTO :CLOBHV; if (sqlcode >= 0) + sqlcode <> 100 loop until LOB is completely fetched (no truncation occurred – compare returned length to provided buffer length) write current piece of data to output file if the column was truncated EXEC SQL FETCH CURRENT CONTINUE CURSOR1 INTO :CLOBHV; endif endloop endif [7] EXEC SQL CLOSE CURSOR1; Januar, 2010 20 DB2 Version 9 (AE) DB2 V9 – Erweiterungen FETCH CONTINUE Beispiel – „dynamic SQL“: Angenommrn in T1 gibt es eine “row”, in der C1 ein gültiges “integer,” C2 100 MB Daten, C3 c32 KB, und C4 XML Daten enthält. [1] [2] [3] EXEC EXEC EXEC EXEC SQL SQL SQL SQL DECLARE CURSOR1 CURSOR FOR DYNSQLSTMT1; PREPARE DYNSQLSTMT1 FROM 'SELECT * FROM T1'; DESCRIBE DYNSQLSTMT1 INTO DESCRIPTOR :SQLDA; OPEN CURSOR1; [4] Prepare for FETCH: Zuweisen der Datenpuffer (32K für jedes CLOB, XML) Stzen der “data pointers” und Längen in der SQLDA. [5] EXEC SQL FETCH WITH CONTINUE CURSOR1 INTO DESCRIPTOR :SQLDA; [6] if truncation occurred on any LOB or XML column loop through each column if column is LOB or XML and was truncated allocate larger buffer area for any truncated columns, move first piece larger area reset data pointers, length fields in SQLDA endif endloop [7] EXEC SQL FETCH CURRENT CONTINUE CURSOR1 INTO DESCRIPTOR :SQLDA endif Arbeiten mit den zurückgegebenen Daten ... [8] EXEC SQL FETCH WITH CONTINUE CURSOR1 INTO DESCRIPTOR SQLDA;. [9] EXEC SQL CLOSE CURSOR1; Januar, 2010 21 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „spatial support“ IBM Spatial Support for DB2 for z/OS bietet eine Reihe von speziellen , sogen. “spatial data types”, die man verwendet, um “real-world entities” zu modellieren, z.B.: Standorte von Kunden, Grenzen in Parks, Lauflinien von Geleisen usw. Man kann diese “spatial data” über “spatial functions” modifizieren und bearbeiten. Sie können über ein SQL Statement Anwendung finden. Man kann auch Indexe auf “spatial data” setzen, die wiederum vom DB2 Optimizer erkannt und verwendet werden können. Direkte Integration mit DB2 • „Spatial data types“: ST_Point, ST_LineString, ST_Polygon, etc • „Spatial functions“: ST_Buffer, ST_Contains, ST_Distance, ST_Within, etc • “Spatial stored procedures” – zur Koordination und Verweis der Systemadministration Implementiert die Open Geospatial Consortium (OGC) SQL Specifikation und ISO SQL/MM “Spatial Standard “ für Typen und Funktionen Beispiele für sogen.: „Spatial Applications“ Versicherungsindustrie: Generieren von Quoten und Risikobewertung auf Basis der geografischen Lage von VN Einzelhandel: Anzeige des Kundenpotentials rund um ein Geschäft, um Werbewirksamkeit feststellen zu können Immobilienhandel: Lokalisieren der Grundstücke auf Basis anliegender Schulen und Umgebungsinformationen Energieversorger : Vermittlerdichte aufgrund der Anforderungen und der Kosten für Anschluss und Lieferung Januar, 2010 22 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „spatial support“ Spatial Queries: 1. Alle Kunden mit einer Hausratversicherung innerhalb von 1 000 Meters von einem Fluss entfernt, die KEINE Überschwemmungsversicherung haben…. 2. Was ist der nächste Einzelhandelsladen der Kunden, die während 2006 mehr als EUR 3K in den Stadtgrenzen von Chikago ausgegeben haben? 3. Suche alle familiengerechten Wohnungen/Häuser in Stuttgart , die im Umkreis einer Schule (5 km) liegen und zu verkaufen sind SELECT FROM WHERE Januar, 2010 c.id, c.name, customer c, river r distance (c.location, r.path) < 5 23 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „omnifind textsearch“ • • • • Bietet Textsuchen für CHAR / VARCHAR / CLOB / XML “Omnifind” nutzt einen sogen. “text index” Server nutzt effiziente Kommunication zum DB2 z/OS Server Omnifind “text indexe” werden in DB2 geseichert(Grund: backup/recovery Gründe) Es existieren diverse STP, ie die Textsuche unterstützen: • START – DB2 verbindet zum OF Server • CREATE IX • UPDATE IX • ALTER IX, DROP IX, CLEAR EVENTS • STOP – „text search“ wird abgeschaltet Januar, 2010 SELECT FROM WHERE customer claim_table contains (REORT, „Das suche ich“) SELECT WHERE int1 FROM text_search CONTAINS(CLB, „is, IBM') = 1 SELECT WHERE int1 FROM text_search CONTAINS(CLB, „is OR IBM') = 1 24 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „native SQL Procedures“ Wurden SQL Prozeduren VOR DB2 V9 erzeugt, so nutzte diese SQL Code und /oder C Code. Die Logik im “SQL procedure body” wurde nach C Code überführt und zuletzt existierte ein compiliertes C Programm ausserhalb des DB2 Katalogs. Mit DB2 V9, gibt es weiterhin “external SQL stored procedures”, die einen C Compiler erforderlich machen und es existieren immer noch “external load modules” ausserhalb von DB2, aber es gibt auch “native SQL procedures”, die die Nutzung eines C Programms nicht mehr erfordern. Diese Verbesserungen in DB2 V9 betreffen nur “native SQL procedures”: • “Nested compound statements in SQL stored procedures” • “New stored procedure related special registers” • “DB2 and DSN commands for native SQL procedures” • “Changes to DB2-supplied dynamic SQL processing applications” • “Differences from external SQL procedures” Mit dem V9 “new function mode”, werden die “procedural statements” einer NSSTP in eine Form konvertiert, die es zulässt, dass dieses Objekt im DB2 Katalog direkt abgelegt werden kann – ähnlich den SQL Statements. Parameterliste und Prozeduroptionen werden in den Datenbankkatalogtabellen abgelegt, wie in vorangegangenen releases. CREATE PROCEDURE UPDATE_BALANCE • • • • • Januar, 2010 Bessere SQL Portabilität zwischen den unterschiedlichen DB2 Plattformen Einfachere Integration in die bestehende Applikationsentwicklungsumgebung Bessere Unterstützung der AE-Standards Versionierung der STP‟s ist möglich ALTER ACTIVATE version n ….. ( IN CUSTOMER_NO INTEGER, IN AMOUNT DECIMAL(9,2) ) VERSION V1 LANGUAGE SQL READS SQL DATA BEGIN DECLARE CUSTOMER_NAME CHAR(20); SELECT CUSTNAME INTO CUSTOMER_NAME FROM ACCOUNTS WHERE CUSTNO = CUSTOMER_NO; END 25 DB2 Version 9 (AE) DB2 V9 – Erweiterungen „unified debugger“ Mit dem Unified Debugger kann man u.a. die Ausführung von “SQL procedure“ Code verfolgen, zeilenweise “breakpoints” setzen und Varaiableninhalte ansehen bzw. Modifizieren. Der Unified Debugger unterstützt “external” und “native SQL” Prozeduren inklusive “nested stored procedures”. Um den Unified Debugger auf “SQL procedures” einzusetzen, müssen “breakpoints” in den Routinen bzw. “executable files“ vorgesehen sein: Grant DEBUGSESSION privilege neue Systemauthorisierung Vorbereiten der “stored procedures” für das “debugging” bei “native SQL procedures” mit ALLOW DEBUG MODE und WLM ENVIRONMENT FOR DEBUG MODE bei “external SQL procedures” über DSNTPSMP bzw. das Development Center , um die SQL Procedur mit der Option BUILD_DEBUG zu erzeugen Bei “Java procedures” sollte die Option ALLOW DEBUG MODE eingeschaltet werden und eine entsprechende passende WLM Umgebung für das “debugging” von JAVA ausgewählt werden Der Java Code muss mit der Option –G kompiliert werden. Januar, 2010 26 DB2 Version 9 (AE) DB2 V9 – Verbesserung des Data Warehousing und OLTP ReportingSystem QMF „Drag and drop querying“, Reporting und Analyse „Executive dashboards“ und Datenvisualisierung Verbessertes OLAP mit DB2 „Cube Views“ Neu entwickelte „cross-platform development environment“ Neues „security model“ zur Zugriffskontrolle & „personalization“ Bereit für den WebSphere Application Server Januar, 2010 27 DB2 Version 9 (AE) DB2 V9 – „Optimization Service Center“ • • • • • Januar, 2010 Verfügbar über die „Accessories Suite“ kostenfrei für DB2 9 for z/OS OSC 1.1 FP4 unterstützt auch DB2 V8 Ersetzt Visual Explain VE Funktionen sind im Data Studio verfügbar 28 DB2 Version 9 (AE) DB2 V9 – „Optimization Service Center“ „Family Product Positioning“ Funktion Queries from Cache, Catalog Visual Explain V9 Optimization Service Center Optim Query / Workload Tuner Yes Yes Yes Access Path Advisor Yes Workload Query Advisor Yes Query Advisor Yes Workload Index Advisor Yes Query Index Advisor Yes Profile based Monitoring Yes Yes Workload Statistics Advisor Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Query Statistics Advisor Yes Visual Plan Hint Access Plan Graph Query Formatter, Annotation Januar, 2010 Yes 29 DB2 Version 9 (AE) DB2 V9 – „Optimization Service Center“ Virtuelle Indexe • auch in DB2 V8 mit PK46687 • ermöglicht Design und Test neuer Indexe • stellt sicher, dass ein IX vom DB2 Optimizer auch verwendet wird • dazu eine neue Tabelle DSN_VIRTUAL_INDEXES zur Aufnahme der Definition eines VI • enthält eine Spalte ENABLE, um den “virtual index” zu aktivieren/deaktivieren • enthält Spalten, um die Katalogstatistiken zu halten (NLEAF, NLEVELS, ...) • Die Ausführung des EXPLAIN Statements berücksichtigt dann den/die “virtual indexes” • Die “Authorization-id”, mit der der EXPLAIN ausgeführt wird, muss derselbe sein, wie der creator / qualifier des “virtual index“ Januar, 2010 30 DB2 Version 9 (AE) DB2 V9 – „Optimization Service Center“ Identifying Problem Query – Dynamic Statements Januar, 2010 31 DB2 Version 9 (AE) DB2 V9 – „Optimization Service Center“ Grafische Darstellung der Pfade und Notationen Januar, 2010 32 DB2 Version 9 (AE) DB2 V9 – „Optimization Service Center“ Behandlung von “Workload Exceptions” und Monitoring Januar, 2010 33 DB2 Version 9 (AE) DB2 V9 – „Optimization Service Center“ Optim Query Tuner und Index Advisor Januar, 2010 34 DB2 Version 9 (AE) DB2 V9 – „Data Studio“ Januar, 2010 35 DB2 Version 9 (AE) Januar, 2010 36