Ich habe eine ziemlich große Tabelle (> 10 Millionen Zeilen) mit häufigen Rohoperationen. Es hat richtige Indizes, aber sie werden schnell fragmentiert. Ohne einen regelmäßigen Wartungsplan für die Indexreorganisation / -wiederherstellung kann die Indexfragmentierung leicht über 90% liegen.
Im Moment habe ich dies behoben, indem ich die Indizes täglich neu organisiert und wöchentlich neu erstellt habe. Ich habe auch mit Füllfaktoren usw. herumgespielt, um die Fragmentierung geringer zu halten.
Mein Hauptproblem ist, dass SQL Server die Indizes ignoriert und stattdessen vollständige Tabellenscans durchführt, wenn die Indizes zu fragmentiert werden. In diesem Fall wird die Anwendung fast beendet, da wiederholte Scans einer so großen Tabelle sehr schwer sind. Ich bin mir ziemlich sicher, dass die Verwendung eines fragmentierten Index in diesen Fällen schneller wäre.
Gibt es eine Möglichkeit, SQL Server den Index unabhängig von seiner Fragmentierung verwenden zu lassen?
quelle
Antworten:
Index Hinweis
Sie können dazu einen Indexhinweis verwenden:
Die Nachteile sind:
Plan Guides
Sie können auch einen Planleitfaden verwenden , der den gewünschten Plan festlegt.
Die Nachteile sind:
Abfragespeicher?
Da Sie sich in SQL Server 2017 befinden, können Sie möglicherweise den Abfragespeicher verwenden, um Pläne zu erzwingen . Dies ist viel einfacher als die Verwendung eines Planleitfadens, es kann jedoch zu einem unerwarteten Plan kommen .
Nachteile:
Alternativen
Ohne mehr zu wissen, würde ich wahrscheinlich gerne untersuchen, ob sich die Indexverwendung aus anderen Gründen ändert, z. B. durch Parameter-Sniffing .
quelle
Wenn SQL Server das nächste Mal den Index ignoriert, versuchen Sie, Statistiken mit FULL SCAN für diesen Index oder für die gesamte Tabelle zu aktualisieren. Wenn das funktioniert, ist die Fragmentierung kein Problem.
Auch SQL Server kümmert sich bei der Auswahl eines Plans nicht um die Fragmentierung, ignoriert jedoch möglicherweise den Index, wenn er aufgrund der "internen Fragmentierung" zu groß wird. Bitte überprüfen Sie den leeren Bereich auf den Seiten Ihres Index.
quelle