2012-08-24 13 views
34

Alles basiert auf der Annahme, dass mit (nolock) für die Situtation völlig angemessen ist. Es gibt bereits viele Fragen, die darüber debattieren, ob mit (nolock) verwendet werden soll oder nicht.mit (nolock) oder (nolock) - Gibt es einen Unterschied?

ich mich umsah habe und nicht in der Lage gewesen, wenn dort zu finden zwischen der Verwendung von with(nolock) ein tatsächlichen Unterschied ist:

select customer, zipcode from customers c with(nolock) 

oder nur (nolock):

select customer, zipcode from customers c (nolock) 

Gibt es eine funktionellen Unterschied zwischen den beiden? Stilistisch?
Ist einer älter als der andere und hat eine Chance, veraltet zu sein?

+1

siehe hier: http://stackoverflow.com/questions/1723910/syntax-for-nolock-in-sql – paul

+2

Sie sind alias. Wenn der Hinweis mit einer anderen Option angegeben wird, muss der Hinweis mit dem Schlüsselwort WITH angegeben werden: 'FROM t MIT (TABLOCK, INDEX (MeinIndex)) 'http://msdn.microsoft.com/en-us/library/ms187373.aspx – edze

+1

Das Nolock kann auch als READUNCOMMITTED bezeichnet werden und es wurde nur in SELECT-Anweisungen angewendet. Es gibt an, dass keine freigegebenen Sperren für die Tabelle ausgegeben werden können, wodurch verhindert wird, dass andere Transaktionen die Daten in der Tabelle ändern. Werfen Sie einen Blick auf diesen Beitrag http://www.sqlserverlogexplorer.com/difference-between-nolock-and-with-nolock/ –

Antwort

45

Es gibt keinen funktionalen Unterschied, aber eventuell funktioniert die Syntax ohne WITH nicht. Dies wurde als veraltet:

select customer, zipcode from customers c (nolock) 

So sollten Sie dieses Format verwenden:

select customer, zipcode from customers c with (nolock) 

Nicht das WITH Schlüsselwort für Tabellenhinweise verwendet hat 2008 seit mindestens SQL Server als veraltet für das folgende Thema Suche der Satz Specifying table hints without using the WITH keyword.:

http://msdn.microsoft.com/en-us/library/ms143729%28SQL.100%29.aspx

(Diskussionen darüber, ob Sie verwenden sollten nolock überhaupt sind natürlich getrennt. I've blogged about them here.)

+0

Als Referenz auf wann '' mit (Nolock) ': http://stackoverflow.com/questions/686724/sql-wann-solltest-du-mit-nolock verwenden? rq = 1 – Rob

+1

@Rob du meinst wenn man nicht 'NOLOCK' benutzt, oder? :-) –

+0

@AaronBertrand Die von Ihnen angegebene MSDN-Verknüpfung gibt an, dass NOLOCK nur für UPDATE- und DELETE-Anweisungen veraltet ist. Es scheint nicht veraltet für SELECT-Anweisungen. – Dono

3

Es hängt wirklich davon ab, auf welcher Version von SQL Server Sie sich befinden.

Auschecken der neuesten Dokumentation für SQL Server 2012 table hintsWITH weglassen ist eine veraltete Feature. Also während from customers c (nolock) wird wahrscheinlich funktionieren; Sie sollten wirklich verwenden from customers c WITH (nolock)

Beachten Sie, dass dies anders ist als from customers nolock; wobei nolock als Tabellenalias dienen würde.

Funktional; sie scheinen gleich zu sein.

2

Ich versuchte dies für eine 170000 + Daten Zeile Ergebnis, aber ich sah keinen Unterschied durch die Abfrage Ausführungsplan. Beide arbeiten auf die gleiche Weise.

+6

Dies sollte ein Kommentar sein, keine Antwort. Es wurde bereits zweimal erwähnt, dass es keinen funktionellen Unterschied mehr gibt als vor einem Jahr. – Leigh

+1

Geben Sie diesem Kerl eine Pause, werden Sie ... –

+0

Es ist schön zu wissen, dass Sie die Pläne auf einem Tisch verglichen haben, der nicht klein ist. Für zukünftige Referenz wäre es wahrscheinlich hilfreich zu wissen, welche Versionsnummer von SQL Server Sie verwenden. (+1 auf jeden Fall) –

5

Obwohl wir keinen Unterschied zwischen (Nolock) und mit (Nolock) finden ... mit (Nolock) würde nicht in SQL Server 2000-Version funktionieren.

Und ich bemerkte auch, dass wenn Sie versuchen, Daten von verbundenen Servern zu ziehen, nur "(Nolock)" nicht funktioniert, während Sie "mit (Nolock)" verwenden sollten.

-- this will not work 
select * from server1.DB1.dbo.table1 (nolock) 

-- this will work 
select * from server1.DB1.dbo.table1 with (nolock) 
+1

Danke, dass du dir die Zeit zum Posten genommen hast. Dies sollte ein Kommentar zu Aarons Beitrag sein, aber ich sehe, dass du noch nicht den Ruf hast, Kommentare zu schreiben. +1, um dich auf den Weg zu bringen. – Rob

Verwandte Themen