質問
背景:実行したいパフォーマンスクリティカルなクエリがありますが、汚い読み取りは気にしません。
私の質問は次のとおりです。参加を使用している場合、それらについても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)
参加したテーブルをロックしていないことを確認するために、参加のヒント?
解決
私は対処しません READ UNCOMMITTED
議論、あなたの元の質問だけです。
はい、必要です WITH(NOLOCK)
結合の各テーブルに。いいえ、あなたのクエリは同じではありません。
この演習を試してみてください。トランザクションを開始し、table1とtable2に行を挿入します。まだ取引をコミットしたりロールバックしたりしないでください。この時点で、最初のクエリは正常に戻り、コミットされていない行が含まれます。 Table2には WITH(NOLOCK)
それについてのヒント。
他のヒント
私はあなたが指定する必要があると確信していました NOLOCK
それぞれのため JOIN
クエリで。しかし、私の経験はSQL Server 2005に限定されていました。
確認するためにMSDNを調べたとき、明確なものは見つかりませんでした。以下の声明は、2008年には上記の2つの声明が同等であると思わせるように思われますが、2005年はそうではありません。
SQL Server 2008 R2
すべてのロックヒントは、すべてのテーブルとビューに伝播されます クエリプランによってアクセスされます, 、ビューで参照されているテーブルとビューを含む。また、SQL Serverは、対応するロックの一貫性チェックを実行します。
SQL Server 2005
SQL Server 2005では、すべてのロックヒントは、ビューで参照されているすべてのテーブルとビューに伝播されます。また、SQL Serverは、対応するロックの一貫性チェックを実行します。
さらに、注意してください - これは2005年と2008年の両方に適用されます。
テーブルにクエリプランでアクセスされない場合、テーブルのヒントは無視されます。これは、オプティマイザーがテーブルにまったくアクセスしないことを選択すること、または代わりにインデックス付きビューにアクセスされるために引き起こされる場合があります。後者の場合、インデックス付きビューへのアクセスは、
OPTION (EXPAND VIEWS)
クエリヒント。
ない。分離レベルをに設定します READ UNCOMMITTED
これは、個々のロックのヒントを与えるよりも常に優れています。または、さらに良いことに、あなたがのような詳細を気にかけているなら 一貫性, 、 使用する スナップショット分離.