1

Wir verwenden Clustered Columnstore Index in unserer Transaktionstabelle, die Order Erfüllungen führt. Diese Tabelle wird regelmäßig durch verschiedene Sitzungen aktualisiert. Aber jede Sitzung ist spezifisch für Auftragsnummer und daher versuchen sie nicht dieselbe Zeile gleichzeitig zu aktualisieren. Aber wir sehen uns mit Problemen konfrontiert, die durch die folgenden Szenarien entstehen können.Deadlock im Clustered Columnstore Index

  • Reihengruppe Verriegelungs & Seitensperre
  • Reihengruppe Verriegelungs & Zeilengruppe

Dies ist nicht spezifisch für eine gespeicherte Prozedur zu verriegeln. Es ist aufgrund mehrerer gespeicherter Prozeduren, die diese Tabelle sequentiell nacheinander aktualisieren, als Teil der Auftragserfüllung.

Die Probe Schema der Tabelle ist sehr einfach:

CREATE TABLE OrderFulfillments 
(
    OrderJobNumber   INT NOT NULL, 
    FulfilledIndividualID BIGINT NOT NULL, 
    IsIndividualSuppressed BIT NOT NULL, 
    SuppressionReason  VARCHAR(100) NULL 
) 

ich für Ihre Referenzprobe Deadlock Graph gegeben haben. Bitte lassen Sie mich wissen, welchen Ansatz ich nehmen kann, um diese Sackgasse zu vermeiden. Wir benötigen den columnstore-Index in dieser Tabelle, da wir Aggregationsoperationen durchführen, um zu sehen, wie oft ein Individuum bereits erfüllt wurde. Ohne columnstore index ist es möglicherweise langsamer.

enter image description here

+0

Sie müssen sich fragen, welche Abfragen die Blockierung verursachen. Wenn die Aktualisierungen wirklich sequentiell waren, sind die Antworten nicht die Aktualisierungen, sondern andere Prozesse wie SELECT-Anweisungen in der Tabelle. Finden Sie heraus, was der last_wait_type von sys.DM_exec_requests ist –

+0

Und ja, eine Select-Anweisung verwendet immer noch eine gewisse Ebene der Sperrung. –

+0

Danke clifton. Ich habe NOLOCK bei jeder ausgewählten Abfrage angewendet. Nur für UPDATE haben wir NOLOCK nicht, um Datenkorruption zu vermeiden. Also, Select ist das nicht das Problem hier. Es ist Lock-Eskalation auf Rowgroup-Ebene, die den Deadlock verursacht. Ich werde Sie mit Wartestatusinformationen –

Antwort

0

In meinem Fall war das Deadlock-Szenario aufgrund Eskalationen sperren geschehen, wie einige der Erfüllungen und in 10,000s oder in 100k Bereichen sehr groß waren und es verursacht wurde Sperreneskalation passieren Ebene rowgroup und in einige Fälle, Seitenebene.

Ich löste dieses Problem, indem ich eine temporäre Tabelle am Anfang der Transaktionen und arbeiten auf Updates auf der temporären Tabelle und schließlich Einfügen der temporäre Tabelle in Bezug auf Erfüllungsinformationen in diesem OrderFulfillments. Diese OrderFulfillments wird auch von temporären Tabelle verwendet, um zu sehen, wie oft die Person bereits erfüllt ist. aber es ist eine gemeinsame Sperre auf der Oberseite und nicht exklusive Sperren.

Durch die temporäre Tabelle, jede Sitzung arbeitet an ihrer eigenen Kopie und Nebenläufigkeitsprobleme gelöst werden.

1

Sie übernehmen NOLOCK das gleiche wie ohne Verriegelung ist ... das ist falsch.

NOLOCK entspricht READUNCOMMITTED.

• Die Hinweise READUNCOMMITTED und NOLOCK gelten nur für Datensperren.

Alle Anfragen, auch mit READUNCOMMITTED und NOLOCK Hinweise, acquire Sch-S (Schemastabilität) Sperren während der Kompilierung und Ausführung. Aus diesem Grund werden Abfragen blockiert, wenn eine gleichzeitige Transaktion eine Sch-M-Sperre (Schemaänderung) für die Tabelle enthält.

Zum Beispiel erwirbt eine DDL-Operation (Datendefinitionssprache) eine Sch-M -Sperre, bevor sie die Schemainformationen der Tabelle ändert.

Alle gleichzeitig ablaufenden Abfragen, einschließlich derjenigen, die mit READUNCOMMITTED- oder NOLOCK-Hinweisen ausgeführt werden, werden beim Versuch, eine Sch-S-Sperre zu erhalten, blockiert. Umgekehrt blockiert eine Abfrage mit einem Sch-S-Lock eine gleichzeitige -Transaktion, die versucht, eine Sch-M-Sperre zu erhalten.

READUNCOMMITTED und NOLOCK nicht für Tabellen, die von einfügen, aktualisieren oder löschen Operationen geändert angegeben werden. Der SQL Server-Abfrageoptimierer ignoriert die READUNCOMMITTED- und NOLOCK-Hinweise in der FROM-Klausel, die auf die Zieltabelle einer UPDATE- oder DELETE-Anweisung anwenden.

Sie minimieren können Konkurrenz Sperren während Transaktionen von schmutzig zu schützen liest von ungebundenen Datenänderungen durch eine der mit folgenden:

• Der READ COMMITTED Isolationsstufe mit der READ_COMMITTED_SNAPSHOT Datenbankoption auf ON gesetzt.

• Die SNAPSHOT Isolationsstufe. Weitere Informationen zu Isolationsstufen finden Sie unter SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table

  • Verstehen Sie, wie Sie Ihre Indizes aufgebaut werden kann Blockierung verursachen, wenn beispielsweise eine select-Anweisung eine ganze Seite erfordert, dass Ihr UPDATE gleichzeitig wird modifiziert.

  • Beschränken Sie Ihre Variablen beim Testen.

  • Sie können Ihre DML in Abschnitte aufteilen. Sie können einen optimalen Bereich finden, um gleichzeitige Änderungen Ihrer Tabellendaten durchzuführen.

+0

aktualisieren und aufhören, NOLOCK so reichlich zu verwenden. Der Optimierer ist im Allgemeinen intelligent genug und wenn Sie NOLOCK häufig verwenden, sollten Sie eine andere ISOLATION-Strategie in Erwägung ziehen. –

Verwandte Themen