Warum ist die Eskalation von Sperren auf Partitionsebene nicht die Standardeinstellung?

7

In SQL Server werden Sperren normalerweise von Zeile oder Seite -> Tabelle eskaliert. Ab SQL Server 2008 wurde eine neue Stufe der Sperreneskalation hinzugefügt - die Partitionsebene .

Dies wird jedoch nicht automatisch für partitionierte Tabellen aktiviert. Standardmäßig ist die Tabelle so eingestellt, dass die Partitionssperre übersprungen wird und direkt von Zeile oder Seite -> Tabelle ausgeht. Warum sollte das so sein? Gibt es einen Grund, warum ich nicht alle meine Tabellen von TABLEauf AUTOändern möchte, damit Sperren auf Partitionsebene anstatt auf Tabellenebene eskaliert werden?

Da die Standardeinstellung immer noch ist TABLE, muss mir wohl etwas an der Kehrseite fehlen AUTO.

SqlRyan
quelle
In SQL Server werden Sperren niemals von Zeilen auf die Seite eskaliert. Es wird immer von Zeilen zur Tabelle eskaliert.
SQL Learner
@MartinSmith Danke für die Klarstellung - du lernst jeden Tag etwas Neues und der verlinkte Artikel + ein bisschen Googeln hat bestätigt, dass ich mich irre! Warum sollte SQL Server sofort eine Sperre auf Seitenebene anstelle einer Sperre auf Zeilenebene durchführen (bevor er zur Tabelle eskaliert)? Es scheint, als würde es immer mit einer Zeile beginnen, aber vielleicht ist eine Seite sinnvoller, wenn ich einen Bereich anstelle einer einzelnen Zeile (oder einer sehr kleinen Teilmenge von Zeilen) aktualisiere.
SqlRyan
@ SQLKiwi: Danke für die Bereinigung - es ist klar, dass mein Verständnis der Eskalation von Sperren ein bisschen
falsch war

Antworten:

7

BOL hat Antwort - Es ist standardmäßig nicht eingeschaltet, da dies das Potenzial für Deadlocks erhöhen kann.

Das Datenbankmodul eskaliert keine Zeilen- oder Schlüsselbereichssperren zu Seitensperren, sondern eskaliert sie direkt zu Tabellensperren. Ebenso werden Seitensperren immer zu Tabellensperren eskaliert. In SQL Server 2008 kann das Sperren partitionierter Tabellen auf die HoBT-Ebene für die zugeordnete Partition anstatt auf die Tabellensperre eskalieren. Eine Sperre auf HoBT-Ebene sperrt nicht unbedingt die ausgerichteten HoBTs für die Partition.

Sperren auf HoBT-Ebene erhöhen normalerweise die Parallelität, führen jedoch zu Deadlocks, wenn Transaktionen, die unterschiedliche Partitionen sperren, ihre exklusiven Sperren auf die anderen Partitionen ausweiten möchten. In seltenen Fällen kann die Granularität der TABLE-Sperre besser sein.

SQL Learner
quelle
@MartinSmith Es scheint, dass Paul diese Zeile auch in den Artikel aufgenommen hat, den Sie oben angegeben haben: "Sie fragen sich möglicherweise, warum die AUTO-Option in SQL Server 2008 nicht die Standardeinstellung ist? Dies liegt daran, dass einige Early Adopters festgestellt haben, dass ihre Anwendungen damit zum Deadlock wurden Achten Sie also genau wie bei den Trace-Flags für die Eskalationssperre darauf, die Option AUTO in SQL Server 2008 zu aktivieren. "
SqlRyan