So Wählen Sie UNCOMMITTED Zeilen, die nur in SQL Server?
Ich arbeite an der DW-Projekt, wo ich zu der Abfrage live-CRM-system. Die standard-Isolationsstufe negativ beeinflusst die performance. Ich bin versucht zu verwenden, keine lock/transaction isolation level read uncommitted. Ich möchte wissen, wie viele der ausgewählten Zeilen sind, werden durch dirty read.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht können Sie dies tun:
Aber dies ist naturgemäß schnittig aus.
Wenn die Idee ist, zu versuchen zu sperren, die jede Zeile wird übersprungen, die sind in der Tat gesperrt ist, müssen Sie verwenden ein sperren-Isolationsstufe und
READPAST
mit row-level-locks, und berücksichtigen die Tatsache, dass RCSI (sowie SI) auf sein.Zum zählen der Anzahl der nicht übergebenen Zeilen, würde ich schreiben:
Beachten Sie, dass
READPAST
können nur überspringen, sperren auf Zeilenebene so einROWLOCK
Hinweis erforderlich ist. DieREADCOMMITTEDLOCK
sorgt dafür, dass sperren read committed verwendet wird. DieSNAPSHOT
Tipp ist nur gültig mit memory-optimierten Tabellen.Es ist wahr, dass der SQL-Server kann manchmal skip exklusive sperren beim Lesen in locking read committed, aber das ist eine sichere Optimierung, die nur gilt, wenn es keine nicht festgeschriebenen änderungen an der Seite.
Warum müssen Sie das wissen?
Verwenden Sie
TRANSACTION ISOLATION LEVER READ UNCOMMITTED
nur um zu zeigen, dassSELECT
Anweisung nicht warten, bis ein update/insert/delete-Transaktionen fertig sind, auf die Tabelle/Seite/Zeilen - und greifen auch dirty records. Und Sie tun es, um die Leistung zu erhöhen. Versucht, erhalten Sie Informationen über die Datensätze waren schmutzig ist wie punch blender zu Ihrem Gesicht. Es tut weh, und gibt Ihnen nichts, aber Schmerzen. Denn Sie waren schmutzig, und jetzt Sie aint. Oder noch schmutzig? Wer weiß...upd
Nun über die Qualität der Daten.
Stellen Sie sich vor Sie Lesen dirty Datensatz mit der Abfrage wie:
und zum Beispiel bekam Datensatz mit
id = 1
undname = 'someValue'
. Als Sie möchten, zu aktualisieren, - Namen, stellen Sie 'anotherValue` - so müssen Sie folgende Abfrage:Also, wenn dieser Datensatz vorhanden ist, Sie ' L bekommen einen aktuellen Wert, wenn es gelöscht wurde (auch auf dirty read - gelöscht und nicht doch noch zugesagt) - nichts schlimmes passiert, Abfrage nicht auf alle Zeilen. Ist es ein problem? Natürlich nicht. Becase in der Zeit zwischen dem Lesen und aktualisieren der Dinge ändern könnte zillion mal. Überprüfen Sie einfach
@@ROWCOUNT
um sicherzustellen Abfrage getan, was es musste, und warnen Sie Benutzer über die Ergebnisse.Sowieso es kommt auf die situation und Bedeutung der Daten. Wenn Daten MUSS werden die tatsächlichen - nicht verwenden, dirty reads
Also, warum nicht Sie Adresse , dass? Sie wissen,dirty reads sind widersprüchlich liest, so solltest du Sie nicht benutzen. Die offensichtliche Antwort ist, um die snapshot-isolation. Lesen Die Umsetzung Snapshot oder Read Committed-snapshotisolation in SQL Server: Eine Anleitung.
Aber das problem geht tiefer tatsächlich. Warum begegnen Sie blockieren? Warum liest blockiert, indem Sie schreibt? Eine DW die Arbeitsbelastung sollte nicht Locker lassen, auf die operativen, transaktionalen Daten, das ist, warum wir haben ETL-und OLAP-Produkte für. Betrachten cubes, columnstores, powerpivot, all die Güte, die ermöglicht, dass unglaublich schnell DW und Analyse. Belasten Sie sich nicht das Geschäft der operativen Datenbank mit Ihrem analytisch end-to-end-scans, haben Sie nichts als Probleme.