Wie bestimmt SQL Server die Reihenfolge, in der Sperren bei der Auswahl einer Tabelle ausgeführt werden?

10

Ich habe zwei gespeicherte Prozeduren, die blockieren, wenn das System unter Last ist. Proc A wählt aus einer Tabelle aus, während Proc B in dieselbe Tabelle einfügt. Das Sperrdiagramm zeigt, dass Proc A eine S-Modus-Seitensperre hat, für die Proc B eine IX-Modus-Sperre wünscht. Proc A wartet jedoch auf eine S-Modus-Seiten-Sperre für eine andere Seite, auf der Proc B bereits eine IX-Modus-Seiten-Sperre hat .

Dies könnte natürlich dadurch behoben werden, dass sichergestellt wird, dass beide Abfragen die Seiten in der Tabelle in derselben Reihenfolge sperren, aber ich kann nicht herausfinden, wie das geht.

Meine Frage lautet: Wie bestimmt SQL Server, in welcher Reihenfolge Seiten beim Einfügen und Auswählen gesperrt werden sollen, und wie können Sie dieses Verhalten ändern?

Martin Brown
quelle

Antworten:

2

Wie bestimmt SQL Server, in welcher Reihenfolge Seiten gesperrt werden sollen, während INSERTs und SELECTs ausgeführt werden? A.

Unbestimmt - erfolgt durch interne Verarbeitung und abhängig von der Ausgabe des Abfrageoptimierers.

und wie können Sie dieses Verhalten ändern?

Kontrolliere deine Isolation. Wenn Sie zum Schreiben lesen, weisen Sie SQL Server an, sofort eine Schreibsperre zu erhalten. Punkt geschlossen.

TomTom
quelle
1

Derzeit verfügt proc A über eine gemeinsame Sperre.

"Keine anderen Transaktionen können die Daten ändern, solange gemeinsam genutzte (S) Sperren für die Ressource vorhanden sind." http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

Wenn Sie mit SQL 2005 oder höher arbeiten, versuchen Sie, die Snapshot-Isolation zu verwenden.

"Die Snapshot-Isolationsstufe verwendet die Zeilenversionierung, um Lesekonsistenz auf Transaktionsebene bereitzustellen. Lesevorgänge erfassen keine Seiten- oder Zeilensperren. Es werden nur SCH-S-Tabellensperren erfasst. Beim Lesen von Zeilen, die durch eine andere Transaktion geändert wurden, wird die Version der Zeile abgerufen, die vorhanden, als die Transaktion gestartet wurde. Sie können die Snapshot-Isolation für eine Datenbank nur verwenden, wenn die Datenbankoption ALLOW_SNAPSHOT_ISOLATION auf ON gesetzt ist. Standardmäßig ist diese Option für Benutzerdatenbanken auf OFF gesetzt. " http://msdn.microsoft.com/en-us/library/ms189122.aspx

Da nur Sch-S-Sperren erfasst werden, sollte Ihr Lesevorgang Ihren Schreibvorgang nicht blockieren können.

"Sch-S-Sperren (Schema Stability) blockieren keine Transaktionssperren, einschließlich exklusiver (X) Sperren." http://msdn.microsoft.com/en-us/library/ms189122.aspx

Beachten Sie, dass Snapshot Isolation Level Tempdb für die Zeilenversionierung stark nutzt. Passen Sie es daher entsprechend an und halten Sie sich an die Best Practices für Tempdb-Festplattenstrategien.

brian
quelle