Dass ich gerne ein Buch über Indizes von Richard Foote hätte, habe ich - glaube ich - gelegentlich schon mal erwähnt. Aber so lange er das nicht schreibt, exzerpiere ich eben weiter seine Blog-Artikel ...
Diesmal behandelt der Herr Foote das Thema, auf welches Segment ein Index Rebuild zugreift, sofern Index und Tabelle in einem verwendbaren Zustand sind. Basis der Untersuchung sind dabei 10046er Traces:
- offline rebuild: gelesen wird immer das kleinste Segment, das die erforderlichen Daten enthält. Das kann die Tabelle sein oder der Index, für den der Neuaufbau durchgeführt wird, oder aber auch ein anderer Index, der die relevanten Daten enthält (und kleiner ist als der Index, der neu aufgebaut werden soll, wobei dieser letzte Fall vermutlich nicht extrem wahrscheinlich ist). Der Zugriff auf die Indizes erfolgt dabei erwartungsgemäß via IFFS. Während des rebuilds wird ein table lock gehalten, so dass keine DML-Operationen auf der Tabelle erfolgen können (was ebenfalls einleuchtet).
- online rebuild: in diesem Fall wird immer die Tabelle gelesen, was höhere I/O-Last erzeugt, aber dafür kein table lock erforderlich macht und DML während des rebuilds erlaubt.
Im Fall der sekundären Indizes von IOTs muss immer das IOT-Segment gelesen werden - und auch das ist keine große Überraschung, da die "rowid guesses" nur aus dem PK kommen können.
Die Prüfung, welches Segment das kleinste und damit die geeignetste Grundlage für den Neuaufbau ist, basiert offenbar nicht auf der Block-Angabe in den Tabellen- bzw. Index-Statistiken - jedenfalls reagiert Oracle nicht auf irreführende Werte, die über dbms_stats.set_table_stats eingeführt werden. Richard Foote erklärt dazu in einem Kommentar: "An index rebuild is an expensive operation so it will be worth doing the necessary homework beforehand to get it right.".
Keine Kommentare:
Kommentar veröffentlichen