SQL Server 2008ではV
、テーブルのビューがA
ありB
、おおよそ次のようになります
create view V as
select * from A
union all
select * from B
から読み取るV
と、クエリはベース テーブルに対してインテント共有ロックを取得しますが、ビュー オブジェクト自体に対してもインテント共有ロックを取得します。
テーブルに IS ロックが必要な理由は明らかであり、ビューの IS ロックにより、ビューの基礎となるテーブルへの同時変更が防止されることがわかります。それはいいです。
クエリ プランには、ビューについての言及は含まれていません。これは完全にコンパイルされており、この場合の結果のプランは、2 つのベース テーブルの行を単純に連結したものです。実際、クエリ プラン XML でビューについて言及されているのは、ステートメント テキストだけです。
テーブルに2 番目のビューを追加するとU
、 からの読み取りV
によってロックがかかることはありませんU
。A
これは、エンジンがとのすべてのビューで IS ロックを取得することを除外しますB
。
データベース エンジンは、ビューをロックすることをどのように認識していますか?
- ステートメント テキストは再度解析されますか?
- この情報を渡すために、クエリプランナーと基になる実行の間に他の情報チャネルはありますか?
詳細については、対応する質問をdba.stackexchange
参照してください。