Ich denke die eigentliche Frage ist:
Wenn mir Dirty Reads egal sind, wirkt sich das Hinzufügen des with- Hinweises (NOLOCK) zu einer SELECT-Anweisung auf die Leistung von:
- die aktuelle SELECT-Anweisung
- andere Transaktionen gegen die angegebene Tabelle
Beispiel:
Select *
from aTable with (NOLOCK)
sql
sql-server
locking
Bob Probst
quelle
quelle
Antworten:
1) Ja , eine Auswahl mit
NOLOCK
wird schneller abgeschlossen als eine normale Auswahl.2) Ja , mit einer Auswahl mit
NOLOCK
können andere Abfragen für die betroffene Tabelle schneller als mit einer normalen Auswahl abgeschlossen werden.Warum sollte das so sein?
NOLOCK
In der Regel (abhängig von Ihrer DB-Engine) bedeutet dies, dass Sie mir Ihre Daten geben. Es ist mir egal, in welchem Zustand sie sich befinden, und Sie müssen sie nicht stillhalten, während Sie daraus lesen. Es ist auf einmal schneller, weniger ressourcenintensiv und sehr, sehr gefährlich.Sie sollten gewarnt werden, niemals ein Update von oder etwas Systemkritisches durchzuführen oder wenn absolute Korrektheit unter Verwendung von Daten erforderlich ist, die aus einem
NOLOCK
Lesevorgang stammen. Es ist absolut möglich, dass diese Daten Zeilen enthalten, die während der Ausführung der Abfrage gelöscht wurden oder die in anderen Sitzungen gelöscht wurden, die noch abgeschlossen werden müssen. Möglicherweise enthalten diese Daten Zeilen, die teilweise aktualisiert wurden. Möglicherweise enthalten diese Daten Datensätze, die gegen Fremdschlüsseleinschränkungen verstoßen. Es ist möglich, dass diese Daten Zeilen ausschließen, die der Tabelle hinzugefügt wurden, aber noch festgeschrieben werden müssen.Sie haben wirklich keine Möglichkeit zu wissen, wie der Status der Daten ist.
Wenn Sie versuchen, Dinge wie eine Zeilenanzahl oder andere Zusammenfassungsdaten zu erhalten, bei denen eine gewisse Fehlerquote akzeptabel ist, dann
NOLOCK
ist, können Sie die Leistung dieser Abfragen steigern und vermeiden, dass sie sich negativ auf die Datenbankleistung auswirken.Verwenden Sie den
NOLOCK
Hinweis immer mit großer Vorsicht und behandeln Sie alle zurückgegebenen Daten verdächtig.quelle
NOLOCK macht die meisten SELECT-Anweisungen schneller, da keine gemeinsamen Sperren vorhanden sind. Das Fehlen der Ausgabe der Sperren bedeutet auch, dass die Autoren nicht durch Ihre SELECT behindert werden.
NOLOCK entspricht funktional einer Isolationsstufe von READ UNCOMMITTED. Der Hauptunterschied besteht darin, dass Sie NOLOCK für einige Tabellen verwenden können, für andere jedoch nicht, wenn Sie dies wünschen. Wenn Sie NOLOCK für alle Tabellen in einer komplexen Abfrage verwenden möchten, ist die Verwendung von SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED einfacher, da Sie den Hinweis nicht auf jede Tabelle anwenden müssen.
Hier finden Sie Informationen zu allen Isolationsstufen, die Ihnen zur Verfügung stehen, sowie Tabellenhinweise.
SET TRANSACTION ISOLATION LEVEL
Tabellenhinweis (Transact-SQL)
quelle
Zusätzlich zu den oben genannten Informationen sollten Sie sich darüber im Klaren sein, dass Nolock tatsächlich das Risiko birgt , dass Sie keine Zeilen erhalten, die vor Ihrer Auswahl festgeschrieben wurden .
Siehe http://blogs.msdn.com/sqlcat/archive/2007/02/01/previous-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx
quelle
Es wird schneller sein, weil es nicht auf Sperren warten muss
quelle
Die Antwort lautet Ja, wenn die Abfrage mehrmals gleichzeitig ausgeführt wird, da jede Transaktion nicht auf den Abschluss der anderen warten muss. Wenn die Abfrage jedoch einmal alleine ausgeführt wird, lautet die Antwort Nein.
Ja . Es besteht eine erhebliche Wahrscheinlichkeit, dass die sorgfältige Verwendung von WITH (NOLOCK) Ihre Datenbank insgesamt beschleunigt. Dies bedeutet, dass andere Transaktionen nicht auf den Abschluss dieser SELECT-Anweisung warten müssen. Andererseits werden andere Transaktionen langsamer, da sie jetzt ihre Verarbeitungszeit mit einer neuen Transaktion teilen.
Achten Sie darauf, nur die Verwendung
WITH (NOLOCK)
in SELECT - Anweisungen auf Tabellen , die einen Clustered - Index haben.WITH (NOLOCK) wird häufig als magische Methode zur Beschleunigung von Datenbanklesetransaktionen genutzt.
Die Ergebnismenge kann Zeilen enthalten, die noch nicht festgeschrieben wurden und häufig später zurückgesetzt werden.
Wenn WITH (NOLOCK) auf eine Tabelle mit einem nicht gruppierten Index angewendet wird, können Zeilenindizes durch andere Transaktionen geändert werden, während die Zeilendaten in die Ergebnistabelle gestreamt werden. Dies bedeutet, dass in der Ergebnismenge möglicherweise Zeilen fehlen oder dieselbe Zeile mehrmals angezeigt wird.
READ COMMITTED fügt ein zusätzliches Problem hinzu, bei dem Daten in einer einzelnen Spalte beschädigt werden, in der mehrere Benutzer dieselbe Zelle gleichzeitig ändern.
quelle