Donnerstag, Mai 09, 2013

Berechnungskorrektur für den CLUSTERING_FACTOR

Richard Foote weist in seinem Blog auf eine wichtige Errungenschaft von Release 12c hin, die es als Patch hinab in die Versionen 11.1.0.7, 11.2.0.2 und 11.2.0.3 geschafft hat: die lange erwartete Korrektur des CLUSTERING_FACTOR (CF) durch einen ergänzenden zweiten Parameter für die Funktion sys_op_countchg. Zur Erinnerung: der CF ist ein Maß für die Sortierung einer Tabelle hinsichtlich des zugehörigen Index: ist die Sortierung von Tabelle und Index identisch, dann ergibt sich ein günstiger CF, der der Anzahl der Tabellenblocks entspricht. Weicht die Sortierung deutlich voneinander ab, so dass ein Index Range Scan von einem Index Block aus in sehr viele Tabellenblocks springen muss, dann ergibt sich ein ungünstiger CF, der im Extremfall der Anzahl der Zeilen in der Tabelle entspricht. Neben der Anzahl der Leaf-Blocks ist der CF die entscheidende Komponente in der Kostenberechung für Index-Zugriffe (sofern sie einen Tabellenzugriff hervorrufen und nicht auf die Indexstruktur beschränkt bleiben).

Das größte Problem des CF war in der Vergangenheit, dass er keine Historie zuletzt betrachteter Blocks berücksichtigte: der Wechsel zwischen wenigen Tabellenblocks, auf die abwechselnd zugegriffen wurde, führte demnach zu einem sehr hohen CF, obwohl die Blocks in einem solchen Fall vermutlich im Cache gehalten wurden und einen sehr effizienten Zugriff gestatteten. Ein Fall, der sich ungünstig auf die CF-Berechnung auswirkt, ist ASSM, da dabei ja explizit mehrere Blocks parallel für eingehende Inserts verwendet werden. Mit Patch 15830250 (der die zutreffende Beschreibung "Index Clustering Factor Computation Is Pessimistic" trägt) wurde der Funktion sys_op_countchg, die für die CF-Berechnung verantwortlich ist, ein zweiter Parameter spendiert, der die Anzahl der zuletzt besuchten Blocks angibt, die bei der CF-Berechnung berücksichtigt werden sollen. Im Artikel des Herrn Foote gibt's neben einer etwas ausführlicheren Erläuterung auch noch ein schönes Testbeispiel. Der Vollständigkeit halber hier noch der Verweis auf Jonathan Lewis' Kommentar zum Thema und Martin Deckers Artikel, der die Auswirkung des Patches als erster angesprochen hatte.

Nachtrag 19.05.2013: in einem zweiten Artikel Clustering Factor Calculation Improvement Part II (Blocks On Blocks) zeigt Richard Foote, dass die TABLE_CACHED_BLOCKS Angabe in der Regel keine massiv ungünstigen Wirkungen auf die CF-Berechnung hat und gibt eine übersichtliche mathematische Erklärung dafür.

Keine Kommentare:

Kommentar veröffentlichen