0

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)新しいテーブルを指すように既存のビューを変更するためのより良いアプローチ?

ありがとう!

4

3 に答える 3

3

発生している問題は、3つのテーブルの間にインデックス付きビューを追加すると、ロックの競合が発生することです。ここに問題についての本当に良い投稿があります:http ://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/02/be-ready-to-drop-your-indexed-view.aspx

テーブルをパーティション化すると、ある程度の緩和が得られる可能性がありますが、パーティション化によってロックの問題が回避されるかどうかはわかりません。ただし、このオプションを調査する場合は、パーティションに揃えられたインデックス付きビューを使用する必要があるため、2008にアップグレードする必要があります。2005では、パーティションをスワップイン/スワップアウトする前にビューを削除する必要があります。

パーティションに合わせたインデックス付きビューの詳細:http://msdn.microsoft.com/en-us/library/dd171921.aspx

于 2010-03-01T15:05:03.610 に答える
0

C を分割テーブルにし、価格更新メカニズムとしてパーティションをスワップイン/スワップアウトすることを検討しましたか? それがインデックス付きビューでどのように機能するかはわかりません-その時点でインデックスを再構築する必要があると思います。これはおそらく、実際に ALTER TABLE で見ているのと同じ状況だと思います。

インデックス付きビューは本当に必要ですか? つまり、通常のビューが使用されている場合、3 つの基礎となるテーブルの適切なインデックスは同じように機能しますか? インデックス付きビューは、3 つのテーブルのいずれかに対するキーの変更時に更新する必要がある場合があることに注意してください。一方、1 つのテーブルのインデックスは、キーが変更された場合、またはそのテーブルでデータが移動した場合にのみ更新する必要があります。通常、インデックス付きビューは、ベース テーブルとは異なる列でインデックスが作成されます。これは、基になるテーブルで使用できるものとは異なる種類のデータ全体のセクションであるためです。その説明は本当に当てはまりますか?

価格の更新にはどのくらいの時間がかかりますか? これが問題の核心であるように見えますが、それ以上の情報がないと言いにくいです。

于 2009-11-23T18:49:17.613 に答える
0

ロックを避けるためにこれを試すことができます。

SELECT a,b,c FROM indexedview as v WITH (NOEXPAND,NOLOCK) WHERE ...
于 2014-03-04T09:01:12.553 に答える