Hallo Julia,
hach, endlich mal wieder eine interessante Datenbank-Frage 😀
Folgende (theoretische) Situation: Ich habe eine große Tabelle und einen B-Baum-Index auf eine der Spalten.
Trotzdem stelle ich bei einer Bereichsanfrage (auf die indexierte Spalte bezogen) fest, dass Index nicht benutzt wird und ein Full Table Scan zustande kommt.
Woran könnte es liegen?
Das wird vermutlich daran liegen, dass die Selektivität bzw. Kardinalität der Abfrage zu niedrig ist bzw. die des Index zu hoch ist.
Um einen Index zu befragen, muss die Datenbank (via Seek) auf der Festplatte hin- und herspringen. Wenn der Index also nicht so spezifisch ist, dass die Ergebnismenge klein ist, müsste das DBMS sehr viele Index-Vergleiche machen und deshalb häufig auf der Platte hin- und herspringen. Das ist sehr aufwendig.
Im Vergleich dazu kann die Datenbank bei einem Full Table Scan einfach in einem Rutsch die Tabelle sequentiell einlesen. Sequentielles Lesen ist deutlich weniger teuer als Random-Reads, weil der Festplattenkopf nicht ständig neu positioniert werden muss. Deshalb kann es günstiger sein, einen Full Table Scan zu machen als einen Index zu nutzen.
Der Performance-Unterschied zwischen Random-Reads und Sequential-Reads wird bei modernen SSDs immer kleiner, weshalb man die Performance-Penalty für Random Reads bei SSDs gerne herunter setzt; ist die Performance-Penalty für ein Seqscan etwa 1.0, dann setzt man sie bei konventionellen Festplatten gerne auf 4.0 und bei modernen SSDs auf 1.1.
LG,
CK