Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wann ist es angebracht, NOLOCK zu verwenden?

Beachten Sie, dass Sie nolock pro Tabelle angeben können.

Normalerweise habe ich nolock in komplexen SELECT-Abfragen verwendet, aber nur für die kleinen Nachschlagetabellen, die sich fast nie geändert haben, und für reine Anzeigedaten. Sie kennen die Tabellen, die die Preise für das laufende halbe Jahr auflisten, oder Lookups von IDs zu Strings etc. Sachen, die sich nur mit großen Updates ändern, nach denen die Server normalerweise sowieso routinemäßig neu gestartet werden.

Diese verbesserte Leistung hat die Wahrscheinlichkeit eines Deadlocks in den geschäftigsten Zeiten erheblich verringert, und was noch wichtiger ist, es war in den schlimmsten Momenten für Abfragen wirklich bemerkbar, die viele Tabellen berührten (was logisch ist, sie müssen weniger Sperren und diese Seitentabellen erhalten werden oft fast überall verwendet, oft abnehmend von 7-8 auf 4 Tische, die gesperrt werden müssen)

Aber seien Sie sehr vorsichtig, fügen Sie es hinzu, überstürzen Sie es nicht und tun Sie es nicht routinemäßig. Es tut nicht weh, wenn es richtig verwendet wird, aber es wird schrecklich weh tun, wenn es unsachgemäß verwendet wird.

Verwenden Sie es nicht für sehr kritische Dinge, Dinge, die berechnen usw., weil es inkonsistent wird, alles, was früher oder später zu einem Schreibvorgang führt.

Eine weitere solche Optimierung ist ROWLOCK, die nur auf Zeilenebene sperrt. Dies ist hauptsächlich beim Aktualisieren (oder Löschen) von Tabellen nützlich, bei denen die Zeilen nicht miteinander in Beziehung stehen, wie z. B. Tabellen, bei denen Sie nur Protokolldatensätze einfügen (und die Reihenfolge, in der sie eingefügt werden, keine Rolle spielt). Wenn Sie ein Schema haben, dass irgendwo am Ende einer Transaktion ein Protokolleintrag in eine Tabelle geschrieben wird, kann dies ebenfalls erheblich beschleunigen.

Wenn Ihre Datenbank einen relativ niedrigen Prozentsatz an Schreibvorgängen aufweist, lohnt es sich möglicherweise nicht. Ich hatte ein Lese-/Schreibverhältnis von weniger als 2:1.

Einige URLs, die ich gespeichert habe, als ich daran gearbeitet habe:

http://www.developerfusion.com/article/1688/ sql-server-locks/4/