Unterschied zwischen Sperren und Konsequenzen auf Zeilenebene und Seitenebene

10

Beim Versuch, meinen Wartungsplan auszuführen, wird folgende Fehlermeldung angezeigt:

Die Ausführung der Abfrage "" ist mit folgendem Fehler fehlgeschlagen: "Der Index" "(Partition 1) für Tabelle" "kann nicht reorganisiert werden, da die Sperre auf Seitenebene deaktiviert ist."

Derzeit ist die Sperre auf Zeilenebene für diesen Index aktiviert. Ich kann das Sperren auf Seitenebene aktivieren, bin mir jedoch nicht sicher, welche Auswirkungen dies hat.

Meine Frage ist: Was ist der Unterschied zwischen den beiden Sperrschemata und was sind ihre realen (in der Produktion) Konsequenzen?

Zwiebelritter
quelle

Antworten:

14

Die Ausführung der Abfrage "" ist mit folgendem Fehler fehlgeschlagen: "Der Index" "(Partition 1) für Tabelle" "kann nicht reorganisiert werden, da die Sperre auf Seitenebene deaktiviert ist."

Der Wartungsplan muss versuchen, eine ALTER INDEX REORGANIZE durchzuführen, bei der es sich um eine Online-Operation handelt. Um die Fragmentierung zu entfernen (Seiten nicht in der richtigen Reihenfolge), müssen Seiten gesperrt und verschoben werden. Dies ist nicht möglich, wenn die Seitensperren deaktiviert wurden. Die einzige Möglichkeit zum Defragmentieren ohne Seitensperren besteht darin, die gesamte Partition zu sperren, was für REORGANIZE nicht nur online möglich ist.

Was ist der Unterschied zwischen den beiden Verriegelungsschemata und was sind ihre realen (in der Produktion) Konsequenzen?

Sie müssen verstehen, was ein Datensatz und eine Seite sind, um die Auswirkungen der Nichtzulassung eines bestimmten Sperrtyps zu bewerten. Wenn Sie mit SQL Server-Speicherinternalen nicht vertraut sind, beginnen Sie mit Anatomie eines Datensatzes und Anatomie einer Seite . Ganz einfach gesagt:

  • Zeilen = Datensätze
  • Zeilen werden in Seiten von 8 KB gespeichert

Wenn Sie die zulässigen Sperrtypen ändern:

  • Seitensperren deaktivieren = Nur Zeilen- und Tabellensperren
  • Zeilensperren deaktivieren = Nur Seiten- und Tabellensperren
  • Deaktivieren Sie beide = Nur Tabellensperren

Mir sind zwei Szenarien bekannt, in denen es vorteilhaft sein kann, einen Sperrtyp nicht zuzulassen. Das bedeutet nicht, dass es keine anderen gibt, hoffentlich wird jemand anderes mit Beispielen einspringen.

Eine Nachschlagetabelle, auf die häufig zugegriffen wird und die sich nur selten ändert. Durch Deaktivieren der Sperren auf Seiten- und Zeilenebene erhalten alle Leser eine gemeinsame Tabellensperre. Dies ist schneller / billiger als die übliche Absicht, die in der Tabelle geteilt wird, gefolgt von Absicht, die auf einer Seite geteilt wird, und schließlich eine gemeinsame Sperre für eine bestimmte Zeile oder Zeilen.

Verhindern eines bestimmten Deadlock-Szenarios - Wenn Sie auf Deadlocks stoßen, die durch gleichzeitige Prozesse verursacht werden, die Sperren erwerben, die sich häufig auf derselben Seite befinden. Wenn Sie Zeilensperren nicht zulassen, werden stattdessen Seitensperren verwendet. Es kann jeweils nur ein Prozess auf die Seite zugreifen, der andere muss warten.

Das erste Beispiel ist die Mikrooptimierung und es ist unwahrscheinlich, dass ein typisches System einen messbaren Nutzen bringt. Das zweite Problem löst dieses spezielle Deadlock-Szenario, kann jedoch unerwartete Nebenwirkungen hervorrufen, z. B. das Beenden der Parallelität in einem anderen Codeabschnitt. Es ist schwierig, die Auswirkungen vollständig zu bewerten. Gehen Sie vorsichtig vor!

Die Standardeinstellung ist, dass beide aktiviert sind und dies nicht ohne wichtigen Grund geändert werden sollte.

Mark Storey-Smith
quelle
9

Wahrscheinlich nichts. Ich bin sicher, MS weiß es besser als Sie oder ich

Ich habe an OLTP-Systemen mit hohem Volumen gearbeitet und hatte nie das Bedürfnis, die Einstellungen zu ändern. Ein Deadlock sollte wiederholt werden, da dies sowieso passieren wird

Zitat aus dem SQL Server Storage Engine-Blog "Lock Escalation in SQL2005" n, das ohnehin vollständig lesenswert ist.

Standardmäßig sind sowohl ROW- als auch PAGE-Sperren aktiviert ... SQL Server wählt in den meisten Fällen die Granularität der ROW-Sperre, kann jedoch gegebenenfalls die PAGE-Sperre auswählen. Für den von Ihnen angegebenen Fall ist eine ROW-Sperre wahrscheinlich. Es gibt keine Möglichkeit, die PAGE-Sperre auf Datenbank- oder Instanzebene zu deaktivieren. Stoßen Sie aufgrund von PAGE-Sperren auf Blockierungen?

Ich gehe davon aus, dass Sie Ressourcen verbrauchen, die an anderer Stelle effektiver eingesetzt werden könnten, wenn Sie nur Rowlocks erzwingen. Wenn Ihre Last hoch genug ist, um wichtig zu sein, warum dann Speicher verbrauchen? Der Blog-Artikel geht darauf ein

Ich vermute, dass dahinter Aberglaube steckt, genau wie diese:

gbn
quelle
+1 aber: Deadlocks in OLTP-Systemen können verhindert werden; Mein System läuft monatelang ohne Deadlocks, obwohl wir 2-3 Mal pro Woche bereitstellen.
AK