2016-04-20 2 views
3

Ich habe gelesen, dass normale Indizes in (zumindest Oracle) Datenbank im Grunde B-Baum-Strukturen sind, und speichern Sie daher die Datensätze behandeln richtigen Wurzelknoten. Datensätze, die kleiner als der Stamm sind, werden iterativ im linken Teil des Baums gespeichert, während Datensätze, die größer als der Stamm sind, im rechten Teil gespeichert werden. Es ist dieser Speicheransatz, der in einem schnelleren Scan durch Baumdurchquerung hilft, da Tiefe und Breite reduziert werden.Funktionieren Indizes in NOT IN oder <> Klausel?

Beim Erstellen von Indizes oder zur Leistungsoptimierung einer where -Klausel sprechen die meisten Handbücher jedoch davon, zuerst die Spalten zu priorisieren, in denen die Gleichheit berücksichtigt werden soll, und dann allein zu den Spalten mit Ungleichheitsklauseln zu wechseln. (NOT IN, <>). Was ist der Grund für diese Beratung? Sollte es nicht möglich sein, vorherzusagen, dass ein gegebener Wert nicht so einfach existiert, wie es ist, einen gegebenen Wert vorherzusagen, existiert eine Baumdurchquerung?

Funktionieren Indizes nicht mit Negation?

Antwort

5

Das Problem ist Lokalität innerhalb des Indexes. Wenn Sie zwei Spalten mit Buchstaben in col1 haben und Zahlen in Spalte 2, dann könnte ein Index wie folgt aussehen:

Ind col1 col2 
1 A 1 
2 A 1 
3 A 1 
4 A 2 
5 B 1 
6 B 1 
7 B 2 
8 B 3 
9 B 3 
10 C 2 
11 C 3 

(ind ist die Position im Index Der Rekord-Locator ausgelassen wird..)

Wenn Sie nach col1 = 'B' suchen, dann können Sie Position 5 finden und dann den Index bis Position 9 scannen. Wenn Sie nach col1 <> 'B' suchen, dann müssen Sie den ersten Datensatz finden, der nicht 'B' ist, scannen und für den ersten Datensatz danach wiederholen. Dies wird mit IN und NOT IN schlechter. Ein weiterer Faktor ist, dass, wenn eine relative Handvoll Datensätze die Gleichheitsbedingung erfüllen, fast alle Datensätze ausfallen werden - und oft sind Indizes nicht nützlich, wenn fast alle Datensätze gelesen werden müssen. Eine Ausnahme bilden gruppierte Indizes.

Oracle hat bessere Indexoptimierungen als die meisten Datenbanken - es wird mehrere Scans von verschiedenen Standorten aus starten. Trotzdem ist eine Ungleichheit für einen Index oft weniger nützlich.

Verwandte Themen