PctFree / FreePage
- Dieses Thema hat 12 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 17 Jahre, 8 Monaten von
Anonym.
-
AuthorPosts
-
6. Januar 2006 um 10:18 Uhr #2644
AnonymInaktivTach zusammen,
ich habe zur Zeit eine Verarbeitung, die nur Inserts auf eine Tabelle macht. Die Tabelle hat 2 ziemlich unterschiedliche Indizes. Eine Analyse des Programmlaufs ergab, dass jede Menge Zeit beim "Lesen" des Indexes, nach dem die Eingabe nicht sortiert war, verbraten wird.
Nun überlegen wir, ob wir der Verarbeitung mit neuen PctFree bzw. FreePage Parametern unter die Arme greifen können. Bislang 10/0. Hat jemand mit sowas Erfahrung?
btw., der Beitrag https://www.ruban.de/DB2_UDB_for_z_OS/DB2_for_z_OS_Tipps_Tricks/Anwendungs-_und_objektorientie/Freespace__PCTFREE_und_FREEPAG/freespace__pctfree_und_freepag.html ist ja ganz interessant; nur wie soll ich die letzten Zeilen deuten?
"When a table, whose indexes are already defined, is populated by using the INSERT statement, both the FREEPAGE and the PCTFREE parameters are ignored. FREEPAGE and PCTFREE are only in effect during a LOAD or REORG operation." Das ist doch hoffentlich so nicht richtig, oder?? ???Danke
Alexander
6. Januar 2006 um 11:25 Uhr #3062
AnonymInaktivHi Alexander,
doch, das ist so richtig! Der Freespace in einem Tablespace soll ja gerade für das SQL benutzt werden, also für Inserts/Updates.
Ich habe den Verdacht, das du an der falschen Schraube drehst, deshalb folgende Fragen:1. Bist du dir sicher, das die Zeit im Insert verbraucht wird (wurde ein Trage durchgeführt)? Oder wird vielleicht vorher versucht die Row per Select zu lesen? (Explain!)
2. Wieviele Rows werden Inserted, wieviele Rows sind zu Programmstart bereits in der Tabelle?
3. Hat die Tabelle einen Clustering Index und finden die Inserts in entsprechender Reihenfolge statt oder wird über den ganzen Tablepsace gestreut?
4. Gibt es auf der Tabelle einen Index mit niedriger Kardinaität? (Lange RID-Ketten)Soweit ein paar unvollständige Stichworte, weil wieder mal keine Zeit, sry!
MfG Rolf
6. Januar 2006 um 13:38 Uhr #3358
AnonymInaktivHallo Rolf,
zuerst zu den Fragen …
1. Ja! Das Programm liest eine seq. Datei und insertet die Sätze blind; Monitorauswertungen …
2. Inserted wurden im letzten Lauf 200T bei 24Mio. vorhandenen
3. Ja! Die Eingabe wird vorher sortiert. Das Programm läuft auf Owner-Ebene (Mandanten) parallel). Wir haben die Sortierreihenfolge auch schon umgestellt; aber egal, ob die Reihenfolge dem ClKey oder dem anderen IX entspricht, er "stirbt" immer an den IOs auf den anderen.
4. Nein! Beide IX mit 5Cols und nahezu unique.Nun zu dem 2Zeiler. Meine Übersetzung lautet:
"Wenn eine Tabelle, deren IX bereits festgelegt sind, über INSERTs gefüllt werden, werden beide Parameter ignoriert. FP und PF haben nur Auswirkungen während eines Loads/Reorgs."
Bei einem INSERT werden (durch die Parameter bestimmte) freie Bereiche nicht genutzt?sach, dass das nich so is …
Thx
Alexander
6. Januar 2006 um 16:16 Uhr #3542
AnonymInaktivHi Alexander,
der Text bedeutet, dass bei einem REORG oder LOAD die Angaben PCTFREE und FREEPAGE relevant sind, d.h. beim Aufbau der Indices wird entsprechend Platz freigelassen. Beim Insert werden diese Werte dagegen ignoriert. Der freie Platz kann also bis zum letzten Byte benutzt werden.
Um "optimale" Werte für PF und FP zu finden, sollte/muss bekannt sein:
> Wie lang ist ein Indexeintrag ? ( Wieviele Bytes sind diese 5 Spalten lang ? )
> Wieviele % Sätze werden eingefügt ( in Bezug zu den bestehenden Daten – ca 1% wenn ich das richtig interpretiert habe)
> Wie eindeutig ist ein Index ( nahezu eindeutig hast Du gesagt )
> Werden diese neuen Daten "querbeet" eingefügt oder kommen bestimmte Schlüsselkombinationen gehäuft vor ( bezogen auf die indizierten Spalten )Und natürlich hilft die Angabe von PF und FP nur, wenn der Tablespace reorganisiert wird.
9. Januar 2006 um 9:05 Uhr #3671
AnonymInaktivHi Alexander,
ich glaube du reibst dich an dem Wort ‚ignored‘. In diesem Zusammenhang ist gemeint, das bei Insert der Freespace nicht so berücksichtigt wird, das er freigehalten wird. Ganz im Gegenteil, er wird benutzt.
Noch ne Frage: finden die Inserts über den ganzen TS gestreut statt?
Habe mal folgendes durchgerechnet:
2 Indizes a 4 Levels = 8 IOs
zzgl. 1 IO für den TS = 9 IOsje IO ca. 10 ms (= 0,01 sec.)
200.000 x 9 x 0,01 = 18.000 sec (= 5 h!)
Das ist natürlich nur eine ganz grobe Rechnung und gilt auch nur wenn wirklich gestreut insertet wird und damit pro Row 9 IOs notwendig sind (was sicher nicht zutrifft), und 10 ms pro IO kann man sich auch drüber streiten, aber geht die Laufzeit in die Richtung???
MfG Rolf
9. Januar 2006 um 15:46 Uhr #3764
AnonymInaktivHallo Rolf und Ulrich,
"ignore", … mächtig blöd formuliert (aus meiner Sicht). Ok, lassen wir das, DB2-Weltbild steht noch.
@Rolf, das sind aber Zahlen *staun*
einer von unseren "dicken" Läufen hat letztens 500T in 30 Minuten elapsed geschafft, andere laufen fast doppelt so lange. Ihr seht, wir jammern vielleicht auf sehr hohem Niveau … aber bei den Analysen fallen halt immer die lange dauernden Zugriffe auf den "nicht-sortierten" Index auf. Und dem wollten wir mit den Parametern entgegenwirken …
die Inserts sind gestreut über den TS und wir reorganisieren auch fleissig …
Grüsse
Alexander
9. Januar 2006 um 16:56 Uhr #3823
AnonymGastHallo,
in ähnlichen Fällen haben wir die sequentielle Eingabedatei VOR der Verarbeitung gemäß dem Index sortiert (per JCL-Sort) und hatten damit tolle Erfolge.
Viele Grüße !!
Eva
9. Januar 2006 um 17:19 Uhr #3861
AnonymInaktivHalo Eva,
die Eingabe ist sortiert (s. #3)
Alexander
10. Januar 2006 um 11:12 Uhr #3890
AnonymInaktiv… 500.000 in 30 min, das geht schon, dann aber
– ans Ende der Tabelle (Clustering IX)
– sortiert
– wenige Indizes, wenige LevelsHatte auch schon solche Fälle. dabei fielen immer wieder die synchronen Reads auf, und die kommen halt von der starken Streuung. Wenn die nicht da ist und die Pages bereits im Bufferpool sind, das merkt man schon! Beobachte mal die sync. Reads – kannst du herausfinden ob sie auf den Indizes stattfinden? Vielleicht hilft ein dedizierter Bufferpool für die IX dieser Tabelle…
MfG Rolf
10. Januar 2006 um 19:57 Uhr #3912
AnonymInaktivHi folks,
die PCTFREE/FREEPAGE Angabe wird während der Inserts/Update natürlich nicht berücksichtigt. Aber sehrwohl wird selbstverständlich der (restliche) vorhandene Freespace genutzt. Wozu wäre das Ganze sonst nützlich.
Ich selbst mag PCTFREE gar nicht, sondern bevorzuge FREEPAGE (mindestens 15, weil dann jede 16. Page frei bleibt und noch "near" ist). PCTFREE kostet immer auch I/O Zeit, beim Lesen, beim Reorg, beim Backup, … Nicht so FREEPAGE!
Bei einem Massen INSERT wäre natürlich mal an LOAD RESUME zu denken. Oder man könnte beim LOAD oder REORG mit der PREFORMAT Option arbeiten, um Pages vorzuformatieren.
Außerdem sollte die SECQTY auf CYL Grenze (also 12 Pages je Track * 15 Trks per Cyl * 4 KB = mindestens auf 720 KB oder einem Vielfachen davon) liegen.
Seit Mitte 2004 besteht die Möglichkeit PCTFREE 0 und FREEPAGE 0 zu setzen, um diese ganze Freiplatzsuche vollständig zu unterbinden. Einfügungen werden einfach immer "hinten" vorgenommen. Sollte ein bißchen schneller gehen.
Viele Grüße
Gernot
11. Januar 2006 um 6:51 Uhr #3923
AnonymInaktivHigh Gernot,
also, wenn Du bei einem Index PCTFREE = 0 hast, dann bedeutet das doch, dass jeder Insert sofort zu einem Split der Index-Leaf-page führt.
( und dann hast Du zwei Indexpages mit 50% Freiplatz ). Wenn zwei benachbarte Indexpages gesplittet werden, ist der zweite Split auch nicht mehr NEAR.
Wie sehen denn Deine Erfahrungen damit aus. Musst Du dann sehr oft die Indices reorganisieren ? Merkst Du Laufzeitschwankungen nach einigen/wenigen INSERTs ?viele Grüsse
Uli
11. Januar 2006 um 19:58 Uhr #3934
AnonymInaktivHi folks, High Ulli,
sorry, ich war etwas ungenau in meiner ersten Antwort:
- Zum Index Page Split:
Der wird nur vorgenommen, wenn der neue Key nicht größer als der bisherige größte Index-Eintrag ist. (Das war früher mal ein großes Problem, neu seit ich glaube V6). Es erfolgt also nicht inmmer zwangsläufig ein Split in der Mitte der Index Leaf Page. - FREEPAGE(0):
Der Admin Guide sagt: "For indexes where most of the inserts will be random, set FREEPAGE so that when an index split occurs, the new page is often relatively close to the original page. However, if the majority of the inserts occur at the end of the index, set FREEPAGE to 0 to maintain sequential order in the index leaf pages." - FREEPAGE(n):
Meine Aussage ‚FREEPAGE(15) … near …‘ trifft nur für Non-Segmented Tablespaces zu. Bei Segmented Tablespaces würde ich stattdessen FREEPAGE=SEGSIZE-1 oder gleich FREEPAGE=64 wählen, denn die Größe wird automatisch passend an die jeweilige SEGSIZE angepasst. - Optimierung bei Massen Inserts und Clustering Index:
Meine Aussage ‚FREEPAGE(0) und PCTFREE(0)‘ möchte ich noch um den Zusatz MEMBER CLUSTER erweitern. Wird der Tablespace mit der Angabe MEMBER CLUSTER angelegt, ignoriert DB2 den expliziten oder impliziten Clustering Index. Die Einfügung wird einfach dort vorgenommen, wo noch Platz ist.
Der SQL Ref Guide sagt: "The implicit or explicit clustering index is ignored when data is inserted into a table space that is defined with MEMBER CLUSTER. Instead of using cluster order, DB2 chooses where to locate the data based on available space. The MEMBER CLUSTER attribute only affects data that is inserted with the INSERT statement; data is always loaded and reorganized in cluster order."
FREEPAGE(0) und PCTFREE(0) und MEMBER CLUSTER sollten in diesem Fall also ganz gut performen.
Ciao
Gernot
26. Januar 2006 um 9:49 Uhr #3943
AnonymInaktivHallo Leutle …
danke für die Hinweise.
werden wir mal nachgehen…
Alexander
- Zum Index Page Split:
-
AuthorPosts
You must be logged in to reply to this topic.