Wie verhindere ich, dass ein massives SELECT andere Anweisungen blockiert?

7

Unsere SQL Azure-Datenbank enthält eine umfangreiche SELECTAnweisung, die etwa einmal pro Tag ausgeführt wird. Die schwere SELECTAnweisung enthält keine Sperrhinweise. Kürzlich haben wir einige Stände in der Produktion beobachtet und hier ist, was sys.dm_exec_requestsfür diesen Zeitraum gezeigt wurde ... Die am längsten laufende Abfrage war die schwere, SELECTdie PAGEIOLATCH_SHWartezeit hatte. Als nächstes folgten andere Abfragen - meistens INSERTAnweisungen mit PAGEIOLATCH_EXWartezeit, die alle Dutzende von Sekunden lang ausgeführt wurden, anstatt sofort ausgeführt zu werden. Im Grunde genommen SELECTstört so schwer allein andere Abfragen.

Wie löse ich das? Ich bin damit einverstanden, dass schwer SELECTlangsam läuft, aber andere Abfragen sollten nicht gestört werden.

scharfer Zahn
quelle
Es scheint möglich zu sein, die Auswahl unter einem Benutzer mit unterschiedlicher Priorität auszuführen. Stackoverflow.com/a/65439, aber keine Ahnung, ob dies in Ihrem Fall hilfreich wäre.
Jkavalik
Wie sieht Ihr Ausführungsplan aus? Es kann Möglichkeiten geben, die Abfrage zu verbessern, um E / A und damit das Blockieren zu reduzieren.
Mark Sinkinson
@MarkSinkinson Ich kann nicht einmal mehr einen Ausführungsplan erhalten, da dazu die Abfrage ausgeführt und die Produktion unterbrochen werden muss.
Scharfzahn
4
Können Sie nicht auf einem Testserver sichern und dort ausführen?
Mark Sinkinson
1
@jkavalik Das wäre eine Spekulation, kein wirklicher Plan.
Scharfzahn

Antworten:

8

Ihre Hauptoptionen sind:

  1. Optimieren Sie die SELECTAbfrage so, dass weniger E / A-Ressourcen verwendet werden.
  2. Führen Sie die Abfrage zu einem ruhigen Zeitpunkt aus.
  3. Führen Sie die Abfrage auf einer separaten Kopie der Datenbank aus (z. B. einer lesbaren sekundären).
  4. Führen Sie die Abfrage in einem E / A-begrenzten Ressourcenpool aus, wie hier beschrieben *.
  5. Wechseln Sie zu einer Größe / Ebene mit höherer E / A-Kapazität.

Randnotiz: In dieser Antwort wird die Verwendung von Isolationsstufen wie RCSI oder SI nicht erwähnt . Diese gelten für das Sperren von Sperren , und die Frage enthält keinen Hinweis darauf: PAGEIOLATCH_XXWartezeiten sind mit Wartezeiten auf physische E / A verbunden .


* Diese Funktion ist in der Azure SQL-Datenbank möglicherweise nicht verfügbar.

Paul White 9
quelle