Früher habe ich gesehen, wie meine erfahrenen Entwickler WITH (NOLOCK) beim Abfragen in SQL Server verwendet haben und mich gefragt, warum sie das verwenden. Jetzt habe ich es untersucht und festgestellt, dass es nützlich ist, um die Leistung bei der Ausführung der Abfrage zu verbessern. Allerdings gibt es einen Nachteil, es zu verwenden. Der Nachteil ist, dass man sich nicht sicher sein kann, ob man die Daten erhält, die gerade in der Tabelle aktualisiert werden, d. h. ohne Sperrschutz kann man nicht garantieren, dass die Daten nicht vorhanden sind sich während der laufenden Abfrage ändert. Ich habe auf diesen Link verwiesen und fand ihn ziemlich nützlich.
Um die Leistung von SQL-Abfragen generell zu verbessern, ist die erste Überlegung, einen Index zu erstellen. Tatsächlich kann neben der Einrichtung von Indizes auch das Hinzufügen eines Abschnitts WITH (NOLOCK) zur Syntax beim Setzen von SQL-Befehlen das Phänomen verbessern, dass Datensätze in einer Umgebung mit vielen Online-Abfragen LOCKED werden und somit die Abfrageleistung verbessern.
Allerdings sollte man beachten, dass SQL SELECT mit (NOLOCK) eine verschmutzte Lesung verursachen kann.
Zum Beispiel:
Weil SQL Server die entsprechende Lock-Konsistenzprüfung durchführt. Um die Gesamtleistung der Datenbankabfrage zu verbessern, fügen Sie WITH (NOLOCK) am Ende des Tabellennamens in Ihrer SELECT-Syntax hinzu, obwohl auch (NOLOCK) akzeptabel ist, aber Microsoft empfiehlt dennoch WITH.
Zusätzlich zum einfachen SELECT kannst du auch die SELECT-Syntax mit JOIN verwenden. Aber DELETE, INSERT, UPDATE und andere Befehle, die Transaktionen erfordern, sind nicht gut...
Einige Dateien besagen, dass die SQL-Abfrageeffizienz mit WITH (NOLOCK) um 33 % gesteigert werden kann. Das Hinzufügen von WITH (NOLOCK) signalisiert SQL Server, dass unser SELECT-Befehl den Transaktionssperrezustand der aktuellen Tabelle nicht berücksichtigen muss, sodass die Leistung deutlich verbessert wird und das Sperrphänomen des Datenbanksystems deutlich reduziert wird (einschließlich Deadlock).
Eine Sache zu beachten ist, dass WITH (NOLOCK) die Transaktionssperre der aktuellen Tabelle nicht berücksichtigt, sodass bei Daten in mehreren Phasen einer Transaktion (z. B. eine Transaktion über mehrere Tabellen – > wie ein Auszahlungssystem) WITH (NOLOCK) die Daten ignoriert, die den Transaktionsprozess gerade verarbeiten...
Um es klar zu sagen: Wenn NoLock verwendet wird, kann man Daten lesen, die zwar geändert wurden, aber die Transaktion noch nicht abgeschlossen ist. Daher sollten Sie, wenn Sie die Echtzeitintegrität von Transaktionsdaten berücksichtigen müssen, sorgfältig über die Verwendung von WITH (NOLOCK) nachdenken.
Wenn Sie keine Transaktionen berücksichtigen müssen, könnte WITH (NOLOCK) eine nützliche Referenz sein.
Anmerkung 1: MIT ( < table_hint > ) Spezifiziert den Tabellenscan, einen oder mehrere vom Abfrageoptimierer verwendeten Indizes, Oder vom Abfrageoptimierer, um diese Datentabelle zu nutzen und den Sperrmodus für diese Anweisung zu verwenden.
Hinweis 2: WITH (NOLOCK) entspricht READ UNCOMMITTED
Zum Schluss sprechen wir über einige kleine Unterschiede zwischen Nolock und with(nolock): 1: Synonyme in SQL05, nur mit (nolock), werden unterstützt; 2: mit (nolock) wird sehr einfach geschrieben und dann der Index angegeben. Beim Abfragen von Anweisungen über Server hinweg kann man nicht mit (nolock), sondern nur nolock verwenden Bei Abfragen auf demselben Server können sowohl mit (nolock) als auch mit nolock verwendet werden Zum Beispiel SQL-Code wählen * aus [IP].a.dbo.table1 mit (nolock). Das zeigt dir den Fehler select * aus a.dbo.table1 mit (nolock). Das funktioniert |