Ich bin ein Berichtsentwickler, der meine Abfragen so effizient wie möglich gestalten möchte. Früher habe ich mit einem Datenbankadministrator zusammengearbeitet, der mir gesagt hat, dass ich - glaube ich, weil ich mich immer mit Berichten auf einem Produktionsserver befasst habe - diese NOLOCK
in jeder einzelnen Abfrage verwenden soll.
Jetzt arbeite ich mit einem DBA zusammen, der NOLOCK
unter allen Umständen gesperrt wurde - auch wenn ein Bericht von mir (aufgrund eines erheblichen Mangels an Indizes für einige Tabellen) die Replikation und Systemaktualisierungen stoppt. Meiner Meinung nach wäre in diesem Fall NOLOCK
eine gute Sache.
Da die meisten meiner SQL-Schulungen aus verschiedenen Datenbankadministratoren mit sehr unterschiedlichen Meinungen bestanden, wollte ich dies einer Vielzahl von Datenbankadministratoren mitteilen.
quelle
Antworten:
Wenn Ihr Bericht Aktualisierungen blockiert, die bestätigen, dass Ihr DBA richtig ist, sollten Sie auf keinen Fall verwenden
NOLOCK
. Allein die Tatsache , dass es gibt Konflikte ist ein klarer Hinweis darauf , dass , wenn Sie würde verwenden Dirty Reads Sie falsche Berichte bekommen würde.Meiner Meinung nach gibt es immer bessere Alternativen als
NOLOCK
:SET TRANSACTION ISOLATION LEVEL
keinen Abfragetipp. Es ist später einfacher, die Isolationsstufe zu korrigieren, als jede Abfrage zu ändern.quelle
Es ist nicht immer schlecht.
Natürlich können Sie damit nicht festgeschriebene Werte lesen (die möglicherweise zurückgesetzt werden und daher niemals logisch existieren) sowie Phänomene wie das mehrmalige oder gar keine Werte lesen.
Die einzigen Isolationsstufen, die garantieren, dass solche Anomalien nicht auftreten, sind serialisierbar / Schnappschuss. Unter Repeatable Read können Werte verfehlt werden, wenn eine Zeile verschoben wird (aufgrund einer Schlüsselaktualisierung), bevor der Scan diese Zeile erreicht. Unter Read Committed können Werte zweimal gelesen werden, wenn eine Schlüsselaktualisierung bewirkt, dass eine zuvor gelesene Zeile vorwärts verschoben wird.
Es ist jedoch wahrscheinlicher, dass diese Probleme auftreten,
nolock
da bei dieser Isolationsstufe standardmäßig ein nach Zuordnung geordneter Scan verwendet wird, wenn geschätzt wird, dass mehr als 64 Seiten gelesen werden müssen . Neben der Kategorie von Problemen, die auftreten, wenn Zeilen aufgrund von Indexschlüsselaktualisierungen zwischen Seiten verschoben werden, sind diese Überprüfungen nach Zuordnungsreihenfolge auch anfällig für Probleme mit Seitenteilen (bei denen Zeilen übersehen werden können, wenn die neu zugewiesene Seite in der Datei früher als der Punkt ist bereits gescannt oder zweimal gelesen, wenn eine bereits gescannte Seite auf eine spätere Seite in der Datei aufgeteilt wird).Zumindest für einfache (einzelne Tabellen-) Abfragen ist es möglich, die Verwendung dieser Scans zu unterbinden und einen nach Schlüsseln geordneten Scan zu erhalten,
nolock
indem einfach einORDER BY index_key
zu der Abfrage hinzugefügt wird , so dass dieOrdered
Eigenschaft vonIndexScan
lautettrue
.Wenn Ihre Berichtsanwendung jedoch keine absolut genauen Zahlen benötigt und die größere Wahrscheinlichkeit solcher Inkonsistenzen toleriert, ist dies möglicherweise akzeptabel.
Aber Sie sollten es sicherlich nicht bei allen Abfragen ablegen, in der Hoffnung, dass es sich um einen magischen "Turbo" -Knopf handelt. Neben der höheren Wahrscheinlichkeit, dass auf dieser Isolationsstufe anormale Ergebnisse oder gar keine Ergebnisse auftreten (Fehler "Scannen mit NOLOCK konnte aufgrund von Datenverschiebung nicht fortgesetzt werden"), gibt es sogar Fälle, in denen die Leistung mit
nolock
erheblich schlechter sein kann .quelle
Dulden Ihre Kunden inkonsistente Ergebnisse in Berichten? Wenn die Antwort nein lautet, sollten Sie NOLOCK nicht verwenden - bei gleichzeitiger Verwendung können falsche Ergebnisse auftreten. Ich habe hier , hier und hier einige Beispiele geschrieben . Diese Beispiele zeigen inkonsistente Ausgaben unter READ COMMITTED und REPEATABLE READ, aber Sie können sie optimieren und auch mit NOLOCK falsche Ergebnisse erzielen.
quelle
Wenn dies der Fall ist, haben Sie eine weitere Möglichkeit:
Anstatt Ihre Abfragen in der Produktionsdatenbank
NOLOCK
auszuführen und mit Sperren und herumzuspielen , können Sie Ihre Berichte von einer Kopie der Produktionsdatenbank ausführen.Sie können es so einrichten, dass es jede Nacht automatisch aus einem Backup wiederhergestellt wird .
Anscheinend werden Ihre Berichte auf Servern auf Kundensites ausgeführt, daher weiß ich nicht, ob das Einrichten dieser Option für Sie eine praktikable Lösung wäre.
(aber andererseits ... sollten sie sowieso Backups haben, so dass Sie nur etwas Serverplatz benötigen, um sie wiederherzustellen)
Ich bin ein interner Entwickler, daher ist dies für mich einfacher, da ich die volle Kontrolle über die Server und Datenbanken habe.
Sie können dies zumindest für die Berichte tun, die nur Daten von gestern und älter benötigen. Möglicherweise müssen einige Berichte in der Produktionsdatenbank verbleiben, aber zumindest verlagern Sie einen Teil der Last in eine andere Datenbank (oder noch besser auf einen anderen Server).
Ich habe die gleiche Situation auch bei der Arbeit:
Wir verwenden eine solche Kopie der Produktionsdatenbank für fast alle Berichterstellungsaufgaben, aber es gibt einige Abfragen, für die die heutigen Daten erforderlich sind.
quelle