Ich habe einen SQL Server 2005, der in letzter Zeit unvorhersehbar geworden ist, und ich kratzte mir am Kopf, warum. Abfragen, die in Sekunden ausgeführt werden, ändern Pläne und dauern Minuten (Zeit in vollem Tabellenscan oder Index-Spool). Das erste und offensichtlichste ist, dass die Statistiken veraltet sind und das Optimierungsprogramm dadurch verwirrt wird. Ich bin jedoch überzeugt, dass dies nicht der Fall ist. Erstens, weil sich die zugrunde liegenden Daten nicht wesentlich ändern (z. B. Hinzufügen von Daten eines Tages zu Daten eines Jahres) bereits in einer Tabelle) und zweitens, weil Auto Create Statistics und Auto Update Statistics beide wahr sind. Der Optimierer wird jedoch verwirrt. Das Ausführen von SQL im Tuning Advisor gibt mir viele mehrspaltige CREATE STATISTICS
Anweisungen, die es zu beheben scheinen (bis sich das nächste bisschen SQL falsch verhält).
Irgendwelche Ideen einer Strategie, mit der ich mich der Ursache dieses Problems nähern kann? Warum reichen die "normalen" Statistiken nicht aus?
quelle
where col=(cast @var...)
) und sein@var
könnte'%'
. Ich habe es erst vor ein oder zwei Wochen geerbt und muss es im Grunde so lange funktionieren lassen, bis es ersetzt wird. Danke für den Link, ich werde es versuchen.SOS_SCHEDULER_YIELD
warCXPACKET
undsp_configure "max degree of parallelism", 1
scheint - vorerst - beide Probleme auf den Kopf geschlagen zu haben. Vielen Dank!Von MSDN :
" Insert Operationen treten auf aufsteigend oder absteigend Schlüsselspalten Statistik auf- oder Schlüsselspalten absteigend, wie Identität oder Echtzeit - timestamp - Spalten, könnten häufigere Aktualisierungen der Statistiken als die Abfrageoptimierer führt erfordern. Insert - Operationen neue Werte auf- oder absteigenden Spalten anhängen Die Anzahl der hinzugefügten Zeilen ist möglicherweise zu gering, um eine Statistikaktualisierung auszulösen.Wenn die Statistiken nicht aktuell sind und Abfragen aus den zuletzt hinzugefügten Zeilen ausgewählt werden, werden für die aktuellen Statistiken keine Kardinalitätsschätzungen für diese neuen Werte erstellt Dies führt zu ungenauen Schätzungen der Kardinalität und einer langsamen Abfrageleistung.
Beispielsweise enthält eine Abfrage, die aus den letzten Auftragsterminen auswählt, ungenaue Kardinalitätsschätzungen, wenn die Statistiken nicht aktualisiert werden, um Kardinalitätsschätzungen für die letzten Auftragstermine zu enthalten.
Nach Wartungsvorgängen Nach Durchführung von Wartungsvorgängen, die die Verteilung von Daten ändern, wie z. B. Abschneiden einer Tabelle oder Masseneinfügung eines großen Prozentsatzes der Zeilen, sollten Sie die Statistiken aktualisieren. Dies kann zukünftige Verzögerungen bei der Abfrageverarbeitung vermeiden, während Abfragen auf automatische Statistikaktualisierungen warten. "
Sie können von Zeit zu Zeit "EXEC sp_updatestats" auf Ihrem System verwenden (geplant) oder die Funktion STATS_DATE für alle Objekte verwenden, um zu sehen, wann ihre Statistiken das letzte Mal aktualisiert wurden und ob seitdem zu viel Zeit vergangen ist. Verwenden Sie UPDATE STATISTIKEN für dieses bestimmte Objekt. Meiner Erfahrung nach sind wir auch mit aktivierter automatischer Statistik gezwungen, die Statistiken von Zeit zu Zeit zu aktualisieren, da Einfügevorgänge keine automatische Aktualisierung ausgelöst haben.
So fügen Sie meinen persönlichen Code hinzu (der in einem wöchentlichen Job verwendet wird, der dynamische Anweisungen für die Aktualisierung von Statistiken erstellt):
Hier bekomme ich alle Objekte, bei denen die Statistiken länger als 3 Monate nicht aktualisiert wurden oder bei denen sich seit der letzten Aktualisierung der Statistiken mehr als 10% der Zeilen geändert haben.
quelle
SOS_SCHEDULER_YIELD
aber ich kann momentan nicht sagen, ob das an den schlechten Plänen liegt oder ob diese (6-jährige, 2-Prozessor, 4G RAM) Box jetzt wirklich nur überlastet ist und ich habe über einen Wendepunkt gegangen.Ich gehe davon aus, dass eine oder mehrere Ihrer Tabellen so groß werden, dass sie nicht die 20% der Änderungen erreichen, die erforderlich sind, um die aktuelle Statistik als veraltet zu kennzeichnen, sodass die automatische Aktualisierung der Statistiken aktiviert wird und es dennoch genügend Aktualisierungen (oder Einfügungen) gibt ), dass die Aktualisierung der Statistiken sehr hilfreich wäre. Das Gleiche habe ich kürzlich in einer bestimmten Umgebung nach dem Upgrade von SQL 2000 auf SQL 2008 gefunden.
Zusätzlich zu den anderen Sites, die in den Antworten oben erwähnt wurden, würde ich vorschlagen, die folgenden Online-Ressourcen zu prüfen.
1) Red-Gate stellt eine Reihe kostenloser eBooks zum Download zur Verfügung, darunter "SQL Server Statistics" von Holger Schmeling. Dort finden Sie das folgende Zitat:
http://www.red-gate.com/our-company/about/book-store/
"Tabellen mit mehr als 500 Zeilen und mindestens 20% der Daten einer Spalte mussten geändert werden, um verknüpfte Statistiken ungültig zu machen."
2) SQL Sentry verfügt über ein kostenloses Plan-Explorer-Tool, mit dessen Hilfe Probleme in einem SQL-Plan aufgespürt werden können, z. B. eine Schätzung von zu vielen oder zu wenigen Zeilen im Vergleich zur tatsächlichen Anzahl von Zeilen für eine bestimmte Tabelle in einer Abfrage. Speichern Sie einfach den tatsächlichen Ausführungsplan in SSMS und durchlaufen Sie die verschiedenen Teile des Plans mit Plan Explorer. Es ist nicht so, dass die Informationen in SSMS mithilfe des grafischen Ausführungsplans nicht verfügbar sind, aber das Tool von SQL Sentry erleichtert die Anzeige erheblich.
http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp
3) Überprüfen Sie das Aktualisierungsdatum der Statistiken selbst auf Tabellen in den Abfragen, an denen Sie mit STATS_DATE () am meisten interessiert sind. Sie können eine schnelle Abfrage finden, um die ältesten Statistiken mit einer Abfrage zu erhalten, die in der folgenden Diskussion zu finden ist.
http://blog.sqlauthority.com/2010/01/25/sql-server-find-statistics-update-date-update-statistics/
Ich hoffe das hilft!
Ich denke, Sie werden das Buch von Red-Gate besonders genießen!
-Jeff
quelle