Dienstag, Juni 28, 2016

Index Sanity Check für Cardinality Schätzungen

Auf das Thema weise ich in den OTN-Foren recht häufig hin und da ist es gut, dass Jonathan Lewis einen Artikel dazu geschrieben hat, auf den man verweisen kann: die Löschung eines Index kann den Ausführungsplan einer Query auch dann ändern, wenn der Index gar nicht im Execution Plan erscheint. Die Erklärung dafür sind Sanity Checks die auf der Basis der Index-Statistiken für mehrspaltige Indizes operieren. Im Artikel stellt Jonathan Lewis ein kleines Beispiel vor, das diesen Sachverhalt deutlich macht: darin wird ein Index gelöscht, der im Ausführungsplan keine Rolle spielt. Dieser Index ist auf einer Kombination von drei Spalten angelegt, von denen die erste 10 distinkte Werte enthält, die zweite nur einen und die dritte wiederum 20 distinkte Werte. Die Kombination der Selektivitäten würde - da der Oracle Optimizer bekanntlich von unabhängigen Wahrscheinlichkeiten ausgeht, also keine Abhängigkeiten annimmt - daraus 10 * 1 * 20 = 200 machen. In den Index-Statistiken ist aber festgehalten, dass die Zahl der tatsächlich auftretenden Kombinationen nur bei 20 liegt und dieser Wert wird dann auch vom Optimizer berücksichtigt. Die Löschung des Index führt dann natürlich zum Verlust der Information und zu einer weniger akkuraten Schätzung. Seit 11g kann man in einem solchen Fall den Informationsverlust durch Anlage von Extended Statistics auf der Spaltengruppe vermeiden, aber grundsätzlich zeigt das Beispiel, dass man beim Löschen "unbenutzter" Indizes vorsichtig sein sollte.

Keine Kommentare:

Kommentar veröffentlichen