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
quelle
WHERE
Klausel verwenden müssen, wird die Methode, an die ich denke, sowieso nicht funktionieren.Antworten:
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.
quelle
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?
quelle