Transaktionsdatenbank für die Buchung von Dingen ...
Unser Anbieter wurde gebeten, #temptables durch @tablevariables zu ersetzen (aufgrund schwerer Kompilierungssperren). Stattdessen wurde er durch eine tatsächliche Tabelle ersetzt, die SPID als Spalte hinzufügt, um sicherzustellen, dass die gespeicherte Prozedur nur auf die entsprechenden Zeilen wirkt.
Sehen Sie ein Risiko bei dieser Arbeitsweise? Bevor alle Transaktionen innerhalb ihrer eigenen Transaktion isoliert wurden ... Ich befürchtete, dass wir diese Tabelle möglicherweise ein paar Mal sperren, aber sie sind der Meinung, dass SQL Sperren auf Zeilenebene verwendet und dadurch keine weiteren Sperren erstellt werden.
SQL Server-Version: 2016 Enterprise - 13.0.5216.0
CREATE TABLE dbo.qryTransactions (
ID int IDENTITY (0,1) NOT NULL CONSTRAINT pk_qryTransactions PRIMARY KEY CLUSTERED,
spid int NOT NULL,
OrderID int,
ItemID int,
TimeTransactionStart datetime,
TimeTransactionEnd datetime,
...other fields
)
CREATE INDEX idx_qryTransactions_spidID ON qryTransactions (spid, ID) INCLUDE (ItemID, OrderID, TimeTransactionStart, TimeTransactionEnd)
Antworten:
Ein bisschen mehr Streifzüge, als in einen Kommentarblock passen ... und möchten einen Kommentar hervorheben, den das OP als Antwort auf Rays Antwort abgegeben hat:
Für eine Minute auf eine leichte Tangente gehen ... was mit diesem Szenario passieren würde, ist Sybase ASE ...
Zurück zum Problem des OP (Kompilierungssperren für den untergeordneten Prozess) ...
Was die Idee betrifft, eine einzelne permanente Tabelle mit @@ SPID zu verwenden, um Zeilen zwischen Sitzungen zu unterscheiden ... war dort, gesehen, dass ... yuck ; wiederkehrende Probleme:
Ich möchte zurückgehen und das Grundproblem (Neukompilierungssperren für den untergeordneten Prozess) (erneut) untersuchen und herausfinden, ob es eine Möglichkeit gibt, diese Kompilierungssperren zu reduzieren (zu beseitigen?). [Leider ist mein SQL Server-Wissen zu diesen Themen ... NULL ... und würde mich daher für Eingaben einiger SQL Server-Compiler-Experten interessieren.]
quelle
Es scheint mir, dass die Verwendung von
@@SPID
Ähnlichem um Ärger bittet.Sitzungs-IDs werden häufig wiederverwendet. Sobald sich eine Benutzerverbindung abmeldet, kann diese Sitzungs-ID erneut verwendet werden und wird wahrscheinlich von der nächsten Sitzung verwendet, die versucht, eine Verbindung herzustellen.
Damit es zumindest halbzuverlässig funktioniert, benötigen Sie einen Anmeldetrigger, mit dem vorherige Zeilen aus derselben Tabelle gelöscht werden
@@SPID
. Wenn Sie dies tun, werden Sie wahrscheinlich feststellen, dass die Tabelle mithilfe der@@SPID
Spalte häufig gesperrt wird.SQL Server verwendet zwar die Zeilensperre, aber auch die Seiten- und Tabellensperre. Natürlich können Sie dies möglicherweise durch eine gute Indizierung abmildern, aber dies scheint mir immer noch ein Anti-Muster zu sein.
Wenn die gespeicherte Prozedur die einzige Methode ist, die für den Zugriff auf die betroffenen Tabellen verwendet wird, können Sie dies mithilfe einer Anwendungssperre untersuchen,
sp_getapplock
um den Zugriff auf die relevanten Teile im Wesentlichen zu serialisieren. Docs für sp_getapplock sind hier . Erik Darling hat einen interessanten Beitrag über sie hier .quelle
Ja, ich sehe Risiken. Es ist naiv, mit Row Locking auf SQL zu zählen. Ich bin mir zum Beispiel ziemlich sicher, dass beim Einfügen und Löschen zumindest Seitensperren verwendet werden. SQL Engine wählt den Sperrtyp basierend auf mehreren Faktoren aus, und keiner dieser Faktoren enthält "ihre Meinung". Pauschallösungen wie das Ändern von temporären Tabellen in Tabellenvariablen sind im Allgemeinen ebenfalls schlechte Ideen. Tabellenvariablen sind in einigen Situationen sehr nützlich, weisen jedoch Einschränkungen und Leistungsprobleme auf. In den meisten Fällen bevorzuge ich temporäre Tabellen. Besonders wenn die Tabelle mehr als ein paar Dutzend Zeilen enthält. Ich würde vom Anbieter verlangen, zu erklären, warum das System "schwere Kompilierungssperren" aufweist und wie dies die Leistung beeinträchtigt. Denken Sie daran, wann immer Sie hinschauen, werden Sie "schwere Schlösser" finden. Das bedeutet nicht unbedingt, dass die Schlösser ein Problem sind. Max ' s Kommentare zu @@ SPID sind ebenfalls wichtig. Darüber hinaus können das Transaktionsmodell und die Fehlerverarbeitung große Probleme verursachen. Wenn auf Ihrem System Deadlocks oder Probleme mit der Eingabedatenqualität auftreten, kann die Standardfehlerverarbeitung dazu führen, dass die Sitzung beendet wird, ohne dass die Tabelle qryTransactions ordnungsgemäß zurückgesetzt wird. IMO der falsche Lösungsansatz für das ursprüngliche Problem.
quelle