Verhindern Sie, dass eine einzelne Abfrage alle Ressourcen belastet

7

Ich habe einen Produktionsdatenbankserver, auf dem SQL Server 2008 R2 ausgeführt wird. Wie kann ich verhindern, dass eine Benutzerabfrage in einer Datenbank alle Systemressourcen und alle Datenbanken auf dem Server blockiert?

Das spezielle Problem, das ich habe, ist eine Abfrage mit einem lang laufenden Cursor. Immer wenn die Abfrage ausgeführt wird, steigt die CPU-Auslastung auf allen Kernen auf 100%, und selbst einfache Abfragen in anderen Datenbanken werden langsamer oder es tritt eine Zeitüberschreitung auf. Ist das normal und was sind die besten Methoden, um dies zu verhindern?

Joseph Sturtevant
quelle
1
Ich würde in Betracht ziehen, die Abfrage zuerst zu
beheben
1
@gbn - Normalerweise wäre das mein Fokus, aber in diesem Fall ist der Benutzer, der die Abfrage geschrieben hat, nicht einmal in meinem Team, also frage ich mich, ob es möglich ist, eine Datenbank vom Standpunkt der Leistung aus zu "sandboxen".
Joseph Sturtevant
Enterprise Edition?
Aaron Bertrand
@ AaronBertrand - Ja. (2008 R2 Enterprise Edition)
Joseph Sturtevant
Ich denke, 2008 ist sehr bald zu Ende. Sie fragen sich, warum Sie das immer noch verwenden?
Learning_DBAdmin

Antworten:

9

Wenn Sie Enterprise Edition verwenden, können Sie den Resource Governor verwenden ( ich habe vor einigen Jahren ein Whitepaper für Microsoft zu diesem Thema geschrieben ). Dies ist besonders effektiv, wenn Sie nur diesen Benutzer (durch SUSER_SNAME()oder HOST_NAME()) identifizieren können . Leider kann dies nicht verwendet werden, um nur eine Abfrage einzuschränken. Sie wird zum Zeitpunkt der Anmeldung implementiert und wirkt sich auf alle Abfragen während der gesamten Dauer ihrer Sitzung aus. Sie können jedoch die CPU im Allgemeinen einschränken. Beachten Sie, dass diese Einschränkung in SQL Server 2008 und R2 nur erzwungen wird, wenn andere Konflikte auf der Box bestehen. In SQL Server 2012 gibt es eine neue Einstellung ( CAP_CPU_PERCENT), mit der Sie die CPU für einen Ressourcenpool einschränken können, selbst wenn sie die einzigen auf der Box sind.

Eine andere Möglichkeit (oder eine zusätzliche Möglichkeit), das Problem anzugreifen, vorausgesetzt, Sie haben die Kontrolle über den Abfragetext selbst (z. B. wird er nicht ad hoc vom Benutzer oder seiner App zusammengestellt), besteht darin, dass diese bestimmte Abfrage immer ausgeführt OPTION (MAXDOP 1)wird verursachen immer noch eine hohe CPU, und die Abfrage wird höchstwahrscheinlich länger dauern, aber Sie können diese Einstellung verwenden, um die Anzahl der betroffenen Scheduler zu begrenzen. Bei einer 16-Kern-Box wird als direktes Ergebnis dieser spezifischen Abfrage nur eine CPU-Spitze angezeigt.

Aaron Bertrand
quelle