66

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

4

2 に答える 2

77

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

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

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

でも、

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

インデックス付きビューを使用している場合は、いくつかの特殊なケースもあるため、もう少し読みたいと思うかもしれません。

詳細については、解像度の表示も参照してください。

于 2008-11-22T17:20:27.553 に答える
12

ロリーの優れた答えを補足するだけです。

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

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

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

于 2009-02-03T01:46:02.720 に答える