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 TABLE
auf 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
.
Antworten:
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.
quelle