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?
sql-server
sql-server-2008-r2
query-performance
Joseph Sturtevant
quelle
quelle
Antworten:
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()
oderHOST_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.quelle