web-dev-qa-db-ja.com

ビューを使用したクエリでのWITH NOLOCKテーブルヒントの使用-ビュー内で伝播しますか?

「WITH NOLOCK」クエリヒントがSQL Serverのビューで使用されている場合、ビュー定義の生のテーブルにNOLOCKが使用されていなくても、そのヒントをビュー定義自体に伝達しますか?これが必要な理由は、サポートスタッフが膨大な時間のかかるクエリを実行したいが、アプリケーション自体のビューを使用してすべてのクエリにこのロックを強制したくない場合があるためです。

57
Turnkey

はい、NOLOCKはビュー定義で使用されるテーブルに伝播します(少なくともSQL Server 2005では)。

MSDNの テーブルヒント を参照してください。

SQL Server 2005では、すべてのロックヒントがビューで参照されるすべてのテーブルとビューに伝達されます。また、SQL Serverは対応するロック整合性チェックを実行します。

しかしながら、

テーブルに計算列が含まれており、他のテーブルの列にアクセスする式または関数によって計算列が計算される場合、それらのテーブルではテーブルヒントは使用されません。これは、テーブルヒントが伝達されないことを意味します。たとえば、クエリのテーブルにNOLOCKテーブルヒントが指定されています。このテーブルには、別のテーブルの列にアクセスする式と関数の組み合わせによって計算される計算列があります。式および関数によって参照されるテーブルは、アクセス時にNOLOCKテーブルヒントを使用しません。

インデックス付きビューを使用している場合は、特別な場合もあるため、もう少し読みたい場合があります。

詳細については View Resolution も参照してください。

67
Rory

ロリーの優れた答えを補うためだけに。

「はい、NOLOCKはビュー定義で使用されるテーブルに伝播します(少なくともSQL Server 2005では)。」

実際、これはSQL 2000でも機能します。 BOLから

Select_statementはSELECTステートメントを使用するため、FROM句で指定されているように、ヒントを使用することが有効です。詳細については、 [〜#〜] from [〜#〜] および [〜#〜] select [〜#〜] を参照してください。

12
Jim V.