SQL Server zwingen, fragmentierte Indizes zu verwenden?

7

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?

mikaelnet
quelle
5
Ich glaube, Sie haben diese Probleme aufgrund veralteter Statistiken, nicht aufgrund von Fragmentierung.
Denis Rubashkin

Antworten:

14

Index Hinweis

Sie können dazu einen Indexhinweis verwenden:

SELECT *
FROM dbo.Users AS u WITH (INDEX = ix_definitely_an_index)
WHERE u.Reputation = 2;

Die Nachteile sind:

  • Möglicherweise viel Code ändern
  • Wenn Sie einen Index umbenennen, wird dies unterbrochen
  • Wenn Sie eine Indexdefinition ändern, ist sie möglicherweise nicht mehr der beste Index

Plan Guides

Sie können auch einen Planleitfaden verwenden , der den gewünschten Plan festlegt.

Die Nachteile sind:

  • Es ist launisch; Wenn Ihre Abfrage nicht genau dieselbe ist, wird Ihr Plan möglicherweise nicht verwendet
  • Es ist schwer einzurichten; man muss alles genau richtig machen
  • Auch das gleiche Zeug wie ein Index-Hinweis, also ... das ist rau.

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:

  • Gleiches Zeug wie oben
  • Sie müssen den Abfragespeicher aktivieren, wenn Sie ihn noch nicht verwenden
  • Abfragespeicher abfragen müssen, um festzustellen, ob erzwungene Pläne fehlschlagen

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 .

Erik Darling
quelle
1

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.

Alexander Suprun
quelle