3つの大きなテーブルにまたがるインデックス付きビューがあります。これらのテーブルの2つ(AとB)は、ユーザートランザクションで常に更新されており、もう1つのテーブル(C)には、週に1回更新する必要のあるデータ製品情報が含まれています。この製品テーブルには、600万を超えるレコードが含まれています。
コアビジネスプロセスでは、これら3つのテーブル全体でこのビューが必要ですが、残念ながら、この側面を変更することはできません。負荷がかかった状態でテストして、最も効率的な構成になっていることを確認するために、SQLサーバーMVPを導入しました。ビューで使用される製品テーブルには1つの列があり、毎週更新する必要があります。
現在発生している問題は、テーブルAおよびBに対するトランザクションの量が増加しているため、テーブルCの更新によってデッドロックが発生していることです。
私はいくつかの異なる方法を試しましたが、役に立ちませんでした。1)テーブルCが「WITH(NOLOCK)」というダーティな読み取りになるようにビューを変更できることを望んでいましたが、インデックスビューでは機能が利用できないようです。
2)表Cの新しい列を更新し、プロセスが完了したときに名前を変更することを考えましたが、ビューの依存関係のためにそれを行うことはできません。
3)また、この値を一時的な製品テーブルに書き込み、ビューに対してALTERステートメントを実行して、新しいテーブルを指すようにするというアイデアも楽しみました。ただし、これを行うと、ビューのインデックスが削除され、再作成にかなりの時間がかかりました。
4)毎週の更新を小さなチャンク(一度に100レコード程度)で実行しようとしましたが、それでもデッドロックが発生します。
質問:
a)SQL Server 2005を使用しています。SQLServer2008には、インデックス付きのビューを備えた新しい機能があり、役に立ちますか?インデックス付きビューを使用してダーティリードを実行する方法はありますか?
b)新しいテーブルを指すように既存のビューを変更するためのより良いアプローチ?
ありがとう!