2008-11-22 2 views
52

Wird ein Query-Hinweis "WITH NOLOCK" für eine View in SQL Server verwendet, wird dieser Hinweis an die View-Definition selbst weitergegeben, auch wenn NOLOCK NICHT für die Raw-Tabellen in der View-Definition verwendet wird? Der Grund dafür ist, dass Supportmitarbeiter manchmal sehr zeitraubende Abfragen durchführen möchten, diese Sperre jedoch nicht für alle Abfragen erzwingen möchten, die die Ansicht in der Anwendung selbst verwenden.Verwendung von WITH NOLOCK Tabellenhinweis in der Abfrage mit der Ansicht - Wird sie in der Ansicht propagiert?

Antwort

62

Ja, NOLOCK wird auf die von der Ansichtsdefinition verwendeten Tabellen propagiert (zumindest in SQL Server 2005).

Siehe Table Hints in MSDN:

In SQL Server 2005, die alle Sperren sind Hinweise auf alle Tabellen und Ansichten propagieren, die in einer Ansicht referenziert werden. Außerdem führt SQL Server die entsprechenden Sperrkonsistenzprüfungen durch.

jedoch

Wenn eine Tabelle enthält, werden berechnete Spalten und die berechneten Spalten durch Ausdrücke oder Funktionen berechnete Spalten in anderen Tabellen, die Tabellenhinweise Zugriff nicht auf diesen Tabellen verwendet. Dies bedeutet, dass die Tabellenhinweise nicht weitergegeben werden. Beispielsweise wird ein NOLOCK-Tabellenhinweis für eine Tabelle in der Abfrage angegeben. Diese Tabelle hat Spalten berechnet, die durch eine Kombination von Ausdrücken und Funktionen berechnet werden, die auf Spalten in einer anderen Tabelle zugreifen. Die von den Ausdrücken und Funktionen referenzierten Tabellen verwenden beim Zugriff nicht den Tabellenhinweis NOLOCK.

Wenn Sie indizierte Ansichten verwenden, möchten Sie vielleicht ein wenig mehr lesen, da es auch einige Sonderfälle gibt.

Siehe auch View Resolution für weitere Informationen.

+0

Danke für die Info, ich habe eine indizierte Sicht für eine Kreuztabelle Eindeutigkeitseinschränkung, aber es wird nicht in dieser bestimmten Abfrage verwendet. – Turnkey

12

Nur um Rorys ausgezeichnete Antwort zu ergänzen.

Er schreibt: "Ja, NOLOCK auf die Tabellen von der Sichtdefinition (zumindest in SQL Server 2005) verwendet ausbreiten wird."

In der Tat wird dies auch in SQL 2000 funktionieren. From BOL:

Da select_statement die SELECT-Anweisung verwendet, ist es gültig und Hinweise zu verwenden, wie in der FROM-Klausel angegeben. Weitere Informationen finden Sie unter FROM und SELECT.

+2

Ich kann bestätigen, dass ich dies in SQL 2000-Ansichten getestet und verwendet habe. –

Verwandte Themen