2009-04-27 10 views
2

にカーソルを経由して(代わりにトリガの使用)ビューを更新するとき、私は更新トリガーUがデータベースでの更新の3つのテーブルT1T2T3と定義されているデータベースD1でビューVを持っていますD2。 これら3つのテーブルには、0.75,6.0 &450万レコードが含まれています。 Sql Serverのバージョンは9.0.3042、Developer Editionです。パフォーマンスの問題のSQL Server 2005

私は上記のビューで次の更新ステートメントを実行すると、それは第二1内の準備ができている:私は次のバッチを発行したとき

UPDATE V 
SET cust_task_id = 11975628 
WHERE custno = '0319607' 

は、しかし、それが完了するまでに1分12秒かかります:

DECLARE CURSOR c 
FOR SELECT custno, cust_task_id FROM V WHERE custno = '0319607' 
FOR UPDATE OF cust_task_id 

OPEN c 
    FETCH NEXT FROM c 

    UPDATE V 
    SET cust_task_id = 11975628 
    WHERE CURRENT OF c  
CLOSE c 
DEALLOCATE c 

Sql Server(8.0.2039、Standard Edition)の2000バージョンで同じデータベース(定義およびレコード数に関して)と同じ更新ステートメントを使用すると、両方のバッチが1秒以内に返されます。

あなたは2000年の計画は、インデックスシーク使用するのに対し、2005年の計画は、テーブルT1T2T3上のインデックス・スキャンを使用していることがわかりSQL Serverの2つのバージョンの上のカーソルのバッチのクエリプランを見てみると。つまり、パフォーマンスの違いを説明します。

2005年のデータベースでsp_updatestatsを試しましたが、それは役に立ちませんでした。

どのように私は2005年のカーソルバッチをどのように実行する必要がありますか?

この問題を調査するために時間をいただき、ありがとうございます。

挨拶、

レックスファーベーク

答えて

1

あなたは2005年版対2000年版のスキーマの差分を行っています。

2005年版は、スキャンの代わりに求めている場合は、あなたの当面の問題を解決するために、あなたのVIEW

+0

Hello Eoin thanxが応答しますが、両方のデータベースの定義は同じです。インデックスがないので –

2

を作成するために使用されます指物師のいずれかの列に索引を欠落している可能性がありますように、それが聞こえる、私たちは同様の問題がありましたもう少し前にSQL 2000でカーソルループ中に変更されたデータソースを使用するカーソルを使用します(この場合、Vから選択してVを更新します)。メモリから(そして、これを確認すると良いでしょう)カーソルのデータソースは、変更が加えられたデータソースを最新の状態に保つように、更新または再生成されました。

私たちの解決策は、まずデータを一時テーブルまたはテーブル変数に選択し、それをカーソルのソースとして使用することでした。もちろん、IDやその他の一意の識別子を使用して更新するためにSQLコードを変更する必要がありますが、システムにこれらの制約があると仮定します。

もちろん、ソリューションには最適化の余地が少しあるように聞こえますが、カーソルは一般的には好ましいアプローチではありませんが、上記の方法では許容できるパフォーマンスレベルに達します。少なくとも今のところ。

+0

こんにちはChris thanxが応答しましたが、このバッチはサードパーティツールのプロファイリング中にプロファイラから解決しました。だから私はバッチで何も変更することはできません。私はもちろんこのソリューションを使用していないだろう:-) –

+0

もしあなたがこの問題をどのように地球上で解決できるかコードを変更できないのであれば? –

+0

なぜ、2000年と比較して2005年がひどく成果をあげているのかという疑問がありますか? –

関連する問題