Ueberwachen Auslastung Tablespace und Indexspace
- Dieses Thema hat 7 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 14 Jahre, 7 Monaten von
Anonym.
-
AuthorPosts
-
21. Januar 2009 um 16:57 Uhr #4019
AnonymInaktivHallo,
ich bin Anwendungsentwickler und benötige eine Query, die die spacemaessige Auslastung von Partitioned Tablespaces aufgrund eines Thresholds auswertet. Detto für Indexspaces. Wer kann hier mit einer Query auf die Katalogtabellen weiterhelfen? Besten Dank im Voraus!
LG
Gernot Unterrainer
P.S.: Verwende DB2 für z/OS V9
21. Januar 2009 um 21:10 Uhr #4190
AnonymInaktivHallo Gernot,
zum einen kann auf physischer Ebene die Auslastung beobachtet werden. Dazu gibt es einen Artikel "DB2 High Used RBA ermitteln" auf dieser Web Site unter https://www.ruban.de/DB2_for_z_OS/z_OS_Code/DB2_z_OS_Code_-_Detail_View/db2_z_os_code_-_detail_view_9.html. Diese Information zeigt aber nicht, wieviel Free Space in dem allokierten Space enthalten ist und ob die Daten "fragmentiert" vorliegen und eigentlich reorganisiert werden sollten.
Zu anderen kann man natürlich den Catalog abfragen. Insbesonderer NPAGES/NACTIVE zeigt, wieviele Pages benötigt wurden. Das alleine muß aber nicht ausschlaggebend sein, wenn man z.B. den Freespace (FREEPAGE, PCTFREE) reduzieren möchte, um Platz (PRIQTY, SECQTY) zu sparen.
Die Frage ist nun also: Welche Information soll die gewünschte Query liefern? Belegter Platz (SPACE), EXTENTS, allokierte Pages, Näherung an physische Limits (2 GB, 4 GB), Einspar-Potenzial? Soll vielleicht ein ALTER Statement generiert werden?   :-[
Viele Grüße
Gernot
22. Januar 2009 um 8:06 Uhr #4318
AnonymInaktivHallo Gernot,
im Prinzip soll die Query jene Tables und Indizes ermitteln, bei denen es vom Platz her eng wird (z.B.: nur mehr 10% vom allozierten Space verfügbar). Wenn diese Query dann die Alter-Statements gleich mitgeneriert, wäre das natürlich die Idealloesung.
LG
Gernot
28. Januar 2009 um 20:37 Uhr #4410
AnonymInaktivHallo Gernot,
hier schon mal eine erste (QMF) Query zur Ermittlung von ALTER Statements für Deine Tablespaces und Indexes.
[highlight]Achtung: Zur Abwehr von SQL-Instrusion-Attacken muß SQL leider verfälscht werden: SELECT->SEL_ECT etc![/highlight]
————————————————————————
— QUERY ERZEUGT ALT_ER INDEX STATEMENTS Â Â Â Â Â Â Â Â
— (IN DER QMF FORM WRAP LINE MIT CODE "CT".) Â Â Â Â Â Â Â Â Â Â Â Â Â
————————————————————————
SEL_ECT ‚ALT_ER INDEX ‚ !! IXCREATOR !! ‚.‘ !! IXNAME !! Â Â
   ‚ PRIQTY ‚ !! STRIP(CHAR(SPACE)) !!               Â
   ‚ SECQTY ‚ !! STRIP(CHAR( MAX( ((SPACE/48/10)*48), 48)) )  !!  Â
   ‚; –PQTY=‘!! STRIP(CHAR(PQTY*4)) !!              Â
   ‚ –SQTY=‘!!STRIP(CHAR(SQTY*4))                 Â
FROM Â SYSIBM.SYSINDEXPART Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
WHERE Â IXCREATOR IN (‚creator‘) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â PARTITION = 0 Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â IXNAME LIKE ‚%‘ Â Â Â Â
AND Â Â ( Â SPACE <> PQTY*4 Â Â Â Â Â Â Â Â Â Â
   —  SQTY*4 <> MAX( ((SPACE/48/10)*48), 48)           Â
   )                                Â
UN_ION ALL Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
SEL_ECT ‚ALT_ER INDEX ‚ !! IXCREATOR !! ‚.‘ !! IXNAME !! Â Â
   ‚ PARTITION ‚ !! STRIP(CHAR(PARTITION)) !!           Â
   ‚ PRIQTY ‚ !! STRIP(CHAR(SPACE)) !!               Â
   ‚ SECQTY ‚ !! STRIP(CHAR( MAX( ((SPACE/48/10)*48), 48)) )  !!  Â
   ‚; –PQTY=‘!! STRIP(CHAR(PQTY*4)) !!              Â
   ‚ –SQTY=‘!!STRIP(CHAR(SQTY*4))                 Â
FROM Â SYSIBM.SYSINDEXPART Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
WHERE Â IXCREATOR IN (‚creator‘) Â Â Â Â Â
AND Â Â PARTITION > 0 Â Â Â Â Â Â Â Â
AND Â Â IXNAME LIKE ‚%‘
AND Â Â ( Â SPACE <> PQTY*4 Â Â
   —  SQTY*4 <> MAX( ((SPACE/48/10)*48), 48) Â
   )                     Â
ORDER Â BY 1 Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
;————————————————————————
— QUERY ERZEUGT ALT_ER TABLESPACE STATEMENTS
— (IN DER QMF FORM WRAP LINE MIT CODE "CT".) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
————————————————————————
SEL_ECT ‚ALT_ER TABLESPACE ‚ !! TS.DBNAME !! ‚.‘ !! Â Â TS.NAME !!
   ‚ PRIQTY ‚ !! STRIP(CHAR(TS.SPACE)) !!             Â
   ‚ SECQTY ‚ !! STRIP(CHAR( MAX( ((TS.SPACE/48/10)*48), 48)) )  !!
   ‚; –PQTY=‘!! STRIP(CHAR(TP.PQTY*TS.PGSIZE)) !!         Â
   ‚ –SQTY=‘!!STRIP(CHAR(TP.SQTY*TS.PGSIZE))           Â
FROM Â SYSIBM.SYSTABLES TB, Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
   SYSIBM.SYSTABLESPACE TS,                    Â
   SYSIBM.SYSTABLEPART  TP                     Â
WHERE Â TB.CREATOR IN (‚creator‘) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TS.PARTITIONS = 0 Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TB.NAME LIKE ‚%‘
AND Â Â TB.TYPE = ‚T‘
AND Â Â TB.DBNAME = TS.DBNAME Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TB.TSNAME = TS.NAME Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TS.DBNAME = TP.DBNAME Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TS.NAME Â = TP.TSNAME Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â ( Â TS.SPACE <> TP.PQTY*TS.PGSIZE Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
   —  TP.SQTY*TS.PGSIZE <> MAX( ((TS.SPACE/48/10)*48), 48)    Â
   )                                Â
UN_ION ALL Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
SEL_ECT ‚ALT_ER TABLESPACE ‚ !! TS.DBNAME !! ‚.‘ !! Â Â TS.NAME !!
   ‚ ALT_ER PARTITION ‚ !! STRIP(CHAR(TP.PARTITION)) !!       Â
   ‚ PRIQTY ‚ !! STRIP(CHAR(TP.SPACE)) !!             Â
   ‚ SECQTY ‚ !! STRIP(CHAR( MAX( ((TP.SPACE/48/10)*48), 48)) )  !!
   ‚; –PQTY=‘!! STRIP(CHAR(TP.PQTY*TS.PGSIZE)) !!         Â
   ‚ –SQTY=‘!!STRIP(CHAR(TP.SQTY*TS.PGSIZE))           Â
FROM Â SYSIBM.SYSTABLES TB, Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
   SYSIBM.SYSTABLESPACE TS,                    Â
   SYSIBM.SYSTABLEPART  TP                     Â
WHERE Â TB.CREATOR IN (‚creator‘) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TS.PARTITIONS > 0 Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TB.NAME LIKE ‚%‘ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TB.TYPE = ‚T‘
AND Â Â TB.DBNAME = TS.DBNAME Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TB.TSNAME = TS.NAME Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TS.DBNAME = TP.DBNAME Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â TS.NAME Â = TP.TSNAME Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
AND Â Â ( Â TP.SPACE <> TP.PQTY*TS.PGSIZE Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
   —  TP.SQTY*TS.PGSIZE <> MAX( ((TP.SPACE/48/10)*48), 48)    Â
   )                                Â
ORDER Â BY 1 Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
; Â Â Â ÂÂ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
Gruß
Gernot
28. Januar 2009 um 20:40 Uhr #4471
AnonymInaktivHallo Gernot, hallo zusammen,
es gibt natürlich noch zahlreiche andere Möglichkeiten und Aspekte. Über den Catalog läßt sich ja auch die Anzahl der EXTENTS ermitteln.
Über weitere Catalog Queries würden wir uns alle sehr freuen. Aber Achtung: SQL bitte verfälschen, sonst wird der Forum-Append mit Fehler 403 abgelehnt.  :'(
Gruß
GernotPS: Ich schiebe bei Gelegenheit noch weitere Queries nach! Â ::)
29. Januar 2009 um 10:36 Uhr #4500
AnonymInaktivHallo Gernot,
zunächst einmal recht herzlichen Dank für deine Unterstützung. Allerdings stellen sich für mich doch einige Fragen zu den generierten Statements: z.: B:
AL_TER TABLESPACE DG13.SG13B30 PRIQTY 3129840 SECQTY 312960; –PQTY=1440 –SQTY=10800.
Nach welchen Kriterien werden die neuen Quantities berechnet (IBM-Empfehlung, eigene Erfahrungswerte…). Sind die auskommentierten Werte die aktuellen? Ich würde nämlich z.b. nur dann ein Alter-Statement generieren, wenn z. b. 80 % des insgesamt allozierbaren Space verbraucht sind (incl. aller Extents). Somit komme ich zu meiner nächsten Frage: Auf welcher Katalogtabelle kann ich die allozierten Extents finden. Nochmals besten Dank an meinen Namensvetter 😉 (Kommt ja in unserem Fall nicht soo oft vor…)
LG
Gernot
29. Januar 2009 um 11:22 Uhr #4522
AnonymInaktiveizs002 wrote: Auf welcher Katalogtabelle kann ich die allozierten Extents finden.
Schau mal in die SYSIBM.SYSTABLEPART bzw SYSIBM.SYSINDEXPART , da gibt es jeweils eine Spalte namens EXTENTS
29. Januar 2009 um 15:06 Uhr #4535
AnonymInaktivHallo Gernot,  (schöner Name  ::) )
Du mußt Dich in die Tiefen der DB2 Space Berechnung herabbegeben, wenn die Berechnung exakt sein soll. Hier ein Link: Estimating disk storage for user data http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/topic/com.ibm.db2.doc.admin/dusdat.htm#dusdat.
Alle Spalten-Beschreibungen der SYSIBM Catalog Tables findest Du unter http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/topic/com.ibm.db2.doc.sqlref/bjnrcatt999763.htm#bjnrcatt999763.
EXTENTS findest Du in SYSIBM.SYSTABLEPART. In der o.g. Doku findest Du auch die Beschreibung zu den von mir in der Query verwendeten Columns.
Das Ziel der bereitgestellten Query: Einfach den verwendeten Space umsetzten in PRIQTY und SECQTY, egal wieviel Freespace oder wie hoch die Auslastung ist. Mit dem nächsten REORG oder LOAD wird der erforderliche Space dann eingerichtet.
Selbst wenn sich bei schnellwachsenden Tables Extents bilden sollten, ist das kein Beinbruch, Hauptsache die secondary Extents sind nicht winzig klein.
Wenn Du eine 80%-ige Auslastung, also 20% Reserve wünschst, dann rechne doch einfach PRIQTY = SPACE * 1.2 !  😮
Viel Erfolg
GernotPS: Übrigens, im DB2 Catalog herumstöbern läßt sich primar mit dem Tool [highlight]DbVisulizer[/highlight] der Fa. Minq, Vertrieb bei der Fa. DBSC http://www.dbsc.de, kostet in der Premium-Ausgabe nur EUR 160 !!!
-
AuthorPosts
You must be logged in to reply to this topic.