Hallo Christian,
vielen Dank für Deine ausführliche und sehr hilfreiche Antwort!
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.
Ok, ich glaube, ich habe es verstanden und fasse zusammen:
- Wenn wir eine kleine Tabelle haben, macht es keinen Sinn, Index Scan zu nutzen.
- Wenn die Anfrage ein Ergebnis mit hoher Kardinalität (also mit vielen Zeilen) liefert, macht es auch Sinn Full Table Scan zu nutzen.
Gilt es nur für B-Baum-Indexe (Daten nicht nur in den Blättern, sondern auch in inneren Knoten)? Oder für alle Index-Strukturen? (B+/B*-Baum, Hash-, Bitmap-Index)?
Noch mal Danke und viele Grüße
Julia