1

私は SQL Server 2008 を使用しており、同じスキーマの 2 つのテーブルがあり、2 つのテーブルのコンテンツを結合して外部アクセスに「テーブル」の単一ビューを提供するビューを作成します。

テーブルの 1 つは読み取り専用で、もう 1 つのテーブルには一括挿入/削除操作が含まれています (もう 1 つのテーブルでは、ある間隔で一括挿入を使用して数千行を挿入し、別の SQL ジョブを実行して毎日数百万行を削除します)。

私の質問は、他のテーブルが一括挿入/削除操作中の場合、物理テーブルがロックされ、外部ユーザーから 2 つのテーブルの結合ビューへのアクセスもブロックされるのでしょうか? (このシナリオでロックのエスカレーションが適用されるかどうかを考えています。行ロックは最終的にテーブルをロックし、最終的にビューのアクセスをロックしますか?)

4

2 に答える 2

2

ほとんどの場合、はい。ロックエスカレーション次第

回避するには (すべてのオプションではありません):

  • WITH (NOLOCK) テーブル ヒントを使用して、ロックを無視し、設定しません。ビューで使用すると、両方のテーブルにも適用されます

  • BCP テーブルでロックされた行をスキップしてもかまわない場合は、WITH (READPAST) を使用します。

  • BCP テーブルのロックの粒度を変更します。sp_tableoptionを使用して、"一括読み込み時のテーブル ロック" = false に設定します。

編集:今、私はコーヒーを飲みました...

読み込み/削除操作中に一括テーブルをクエリし、正確な結果を取得し、パフォーマンスの影響受けないようにする必要がある場合は、SNAPSHOT 分離を検討する必要があることをお勧めします

編集 2: SNAPSHOT 分離

于 2009-06-11T08:12:46.670 に答える
2

他のテーブルが一括挿入/削除操作中の場合、物理テーブルはロックされ、外部ユーザーから 2 つのテーブルの結合ビューへのアクセスもブロックされますか?

はい、ただし、オプティマイザーが一括挿入テーブルへのアクセスを伴わないクエリを実行する方法を見つけた場合、アクセスはブロックされません。

一括読み込み時間を最適化したい場合は、このブログ投稿を必ずお読みください。

編集

あなたが経験している実際の問題は何ですか?このビューをどこでも使用する必要がありますか (たとえば、ビューを介してクエリを実行している 1 つのテーブルのデータのみが必要な場所はありますか?)

ビューを常に「オンライン」にしたい場合は、スナップショット分離を検討するか、フル セットをバルク テーブルにロードする場合 (たとえば、フル コンテンツを毎日置き換える)、データを別のテーブルにロードして、 sp_rename テーブル (トランザクション内)

于 2009-06-11T08:10:33.240 に答える