Hintergrund: Ich habe eine leistungskritische Abfrage, die ich ausführen möchte, und mir sind Dirty Reads egal.
Meine Frage ist; Wenn ich Joins verwende, muss ich auch für diese den NOLOCK-Hinweis angeben?
Zum Beispiel; ist:
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID
Gleichwertig:
SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID
Oder muss ich den (NOLOCK)
Hinweis auf dem Join angeben, um sicherzustellen, dass ich die verknüpfte Tabelle nicht sperre?
quelle
Weder. Sie legen die Isolationsstufe fest,
READ UNCOMMITTED
die immer besser ist, als einzelne Sperrhinweise zu geben. Oder, noch besser, wenn Sie sich für Details wie Konsistenz interessieren , verwenden Sie die Snapshot-Isolation .quelle
using (TransactionScope scope=new TransactionScope(..., TransactionOptions) {...}
und stellen Sie die folgendenIsolationLevel
Optionen ein: msdn.microsoft.com/en-us/library/…ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON;
. Die Ergebnisse sind spektakulär, da alle normalen Lesevorgänge zu Lesevorgängen werden, die sperrfrei und dennoch konsistent sind. Die Kosten sind erhöhttempdb
laden: msdn.microsoft.com/en-us/library/ms175492.aspx