質問

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

私の質問は次のとおりです。参加を使用している場合、それらについても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 これは、個々のロックのヒントを与えるよりも常に優れています。または、さらに良いことに、あなたがのような詳細を気にかけているなら 一貫性, 、 使用する スナップショット分離.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top