3

私は、非常に多くのテーブルを内部的に結合するひどいビューを使用しており、そのうちのいくつかは同じテーブルです。

テーブルがそれ自体に結合されているとき、それNOLOCKが一方の結合にあり、もう一方の結合にない場合、ヒントはどのように解釈されるのでしょうか? はテーブルでまだ有効ですか、または が同じテーブルの結合の 1 つに含まれていないNOLOCK場合、テーブルは完全にロックされていますか?NOLOCK

例 (これは疑似コードです。有効なJOIN ON条件があると仮定します):

SELECT *
FROM Table1 t1 (NOLOCK)
JOIN Table2 t2 (NOLOCK)
JOIN Table2_Table2 tt (NOLOCK)
JOIN Table2 t22 (NOLOCK)
JOIN Table1 t11

Table1ロックされますか、それともNOLOCKed のままですか?

4

3 に答える 3

0

非常に簡単に言えば、次のように考えてください。クエリで参照する各テーブルは、そのテーブルにアクセスする物理的な実行計画演算子になります。テーブル ヒントはその演算子に適用されます。これは、同じテーブルに対してロック ヒントを混在させることができることを意味します。要求したロック動作は、この特定のオペレーターがたまたま読み取った行に適用されます。それぞれのオペレーターは、テーブルをスキャンしたり、行の範囲をスキャンしたり、単一の行を読み取ったりする場合があります。それが何であれ、指定されたロックオプションの下で実行されます。

クエリの実行計画を見て、個々の演算子を見つけます。

于 2014-08-26T22:20:46.093 に答える
0

nolock を使用しないと、クエリの他の場所で nolock に結合されているかどうかに関係なく、何らかのタイプのロックが発生すると思います。そのため、行ロックが発生する可能性が高いため、nolock がない結合の隣に nolock を配置します。

于 2014-08-26T22:13:53.123 に答える