175

背景:実行したいパフォーマンスクリティカルなクエリがあり、ダーティリードは気にしません。

私の質問は; 結合を使用している場合、それらにもNOLOCKヒントを指定する必要がありますか?

例えば; は:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID

に相当:

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID

または(NOLOCK)、結合されたテーブルをロックしないように、結合のヒントを指定する必要がありますか?

4

3 に答える 3

189

私は議論に対処せずREAD UNCOMMITTED、あなたの最初の質問だけに対処します。

WITH(NOLOCK)はい、結合の各テーブルに必要です。いいえ、クエリは同じではありません。

この演習を試してください。トランザクションを開始し、table1とtable2に行を挿入します。まだトランザクションをコミットまたはロールバックしないでください。この時点で、最初のクエリは正常に返され、コミットされていない行が含まれます。WITH(NOLOCK)table2にはヒントがないため、2番目のクエリは返されません。

于 2010-09-24T15:09:41.223 に答える
19

クエリNOLOCKでそれぞれにを指定する必要があると確信していました。JOINしかし、私の経験はSQLServer2005に限定されていました。

確認のためにMSDNを調べたところ、明確なものは見つかりませんでした。以下のステートメントは、2008年の場合、上記の2つのステートメントは同等であると思わせますが、2005年の場合はそうではありません。

[SQL Server 2008 R2]

すべてのロックヒントは、ビューで参照されるテーブルとビューを含め、クエリプランによってアクセスされるすべてのテーブルとビューに伝達されます。また、SQLServerは対応するロック整合性チェックを実行します。

[SQL Server 2005]

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

さらに、注意してください-これは2005年と2008年の両方に適用されます。

テーブルがクエリプランによってアクセスされない場合、テーブルヒントは無視されます。これは、オプティマイザがテーブルにまったくアクセスしないことを選択したか、代わりにインデックス付きビューにアクセスしたことが原因である可能性があります。OPTION (EXPAND VIEWS)後者の場合、クエリヒントを使用することで、インデックス付きビューへのアクセスを防ぐことができます。

于 2010-09-24T02:04:39.963 に答える
11

ない。READ UNCOMMITTED個別のロックヒントを与えるよりも常に優れている分離レベルを設定します。または、一貫性などの詳細に関心がある場合は、スナップショットアイソレーションを使用してください。

于 2010-09-24T02:25:04.407 に答える