SQL Server Select Count READ_COMMITTED_SNAPSHOT FRAGE

8

Ich scheine viele Deadlocks zu bekommen, wenn ich select count (*) für eine bestimmte Tabelle mache. Ich habe bereits alle erforderlichen Parameter geändert und sie in eine Nur-Zeilen-Sperre umgewandelt.

Ich habe auch die Datenbank geändert, um die READ_COMMITTED_SNAPSHOT-Isolation zu verwenden.

Es scheint jedoch, dass bei Verwendung einer Auswahlanzahl (*) mit column =? auf dem Tisch löst Deadlocks oder Sperren auf dem Tisch aus.

Stimmt es, dass die Auswahlanzahl (*) nur auf Zwischenzeilen zugreifen soll? Dies scheint jedoch nicht der Fall zu sein, und ich stoße immer noch auf Deadlocks. Eine ordnungsgemäße Indizierung würde wahrscheinlich helfen,

Die Frage lautet: Setzt SQL Server 2008 R2 während der Auswahlanzahl (*) eine gemeinsam genutzte Sperre für die Tabelle, selbst wenn read_committed_snapshot aktiviert ist?

Vielen Dank

grassbl8d
quelle
Benötigen Sie eine genaue Zählung (ab Anfrage) oder ist eine ungefähre Zählung in Ordnung?
Jon Seigel
Eigentlich muss ich nur wissen, ob gemeinsam genutzte Sperren platziert werden. Ich versuche, ein Deadlock-Problem zu untersuchen. Danke
grassbl8d
Mein Punkt war, dass, wenn Sie erwägen können, die Art und Weise zu ändern, wie die Zählung erhalten wird, dies möglicherweise der Weg ist, um das Deadlock-Problem zu lösen. Aber jetzt, wo ich die Frage noch einmal lese, wenn Sie eine WHEREKlausel verwenden müssen, wird die Methode, an die ich denke, sowieso nicht funktionieren.
Jon Seigel
Sie können ungefähre Zählwerte aus Metadatentabellen für eine Teilmenge der Tabelle abrufen, wenn die where-Klausel mit einem gefilterten Index übereinstimmt.
Aaron Bertrand

Antworten:

2

Seien Sie vorsichtig mit READ_COMMITTED_SNAPSHOT: Wenn Sie es aktivieren, kann es viele subtile Fehler verursachen.

Auch READ_COMMITTED_SNAPSHOT ist die Standardisolationsstufe, die möglicherweise von etwas überschrieben wird. Führen Sie DBCC USEROPTIONS aus, um die tatsächliche Isolationsstufe zu bestimmen, unter der Ihre Auswahl ausgeführt wird.

Ich würde explizit TRANSACTION ISOLATION LEVEL SNAPSHOT direkt vor Ihrer Auswahl einstellen. Auf diese Weise können Sie sicher sein, dass Ihre Auswahl niemals Deadlocks enthält, und Sie brechen keinen anderen Code, wie dies bei READ_COMMITTED_SNAPSHOT der Fall sein könnte.

AK
quelle
0

Die Sperre mit Snapshot Isolation ändert sich nicht. Was sich ändert, ist, dass wenn Seiten unter Ihnen geändert werden, diese Seiten in die Tempdb-Datenbank kopiert werden, damit Sie sie aus der Tempdb-Datenbank anstatt aus der normalen Datenbank lesen können. (Ja, dies ist eine vereinfachte Version dessen, was passiert.)

Sie haben erwähnt, dass keine ordnungsgemäße Indizierung vorhanden ist, sodass Sie einen Clustered-Index-Scan durchführen (oder einen Tabellenscan, wenn es sich um einen Heap handelt). Das sind möglicherweise viele Daten, die in die Tempdb-Datenbank verschoben werden müssen. Wenn diese Abfrage mehrmals ausgeführt wird, würde ich vorschlagen, den Index zur Tabelle hinzuzufügen.

Welche Isolationsstufe verwendet Ihre Abfrage?

mrdenny
quelle
Ich verwende die Isolationsstufe read_commited_snapshot. Ich habe es eingeschaltet, da ich standardmäßig read_committed verwende. Ich bin nur daran interessiert, ob während ausgewählter Zählungen Sperren gesetzt werden. Danke, ich habe bereits Indizes übrigens platziert
grassbl8d
Ja, Schlösser werden noch genommen. Sie können sys.dm_tran_locks abfragen, um die gesperrten Sperren anzuzeigen. Führen Sie Ihre Abfrage in einem Fenster aus und fragen Sie sys.dm_tran_locks in einem anderen Fenster ab, um festzustellen, welche Sperren verwendet werden. Möglicherweise eskalieren Sie zu Tabellensperren und müssen einen Hinweis verwenden, um Sperren auf Seiten- oder sogar Zeilenebene zu erzwingen.
Mrdenny