2010-12-01 13 views
0

パフォーマンスの問題があります
.Net 1.1からストアドプロシージャを実行する必要があります。このストアドプロシージャは8個のストアドプロシージャを呼び出します。それらのそれぞれは、古い情報と新しい情報との比較をスローするための情報を処理し、データベースの物理テーブルを検出します。8つのネストされたストアドプロシージャでのパフォーマンスの問題

問題はSSMSから直接実行しようとしているために発生します。サーバーのクラッシュが始まり、遅くて作業がほとんど不可能になります。私は、インフラストラクチャの人々はサーバー上で直接サービスをrestarする必要があると思います。

私は開発環境で作業していますので問題はほとんどありませんが、これを実稼働環境にアップロードすることはできません。

私は、比較の目的でのみ使用手順を考えていましたが、物理データには決して影響しませんでした。プリンシパルプロシージャのテンポラリテーブルで情報を取得してから、try-catchおよびbegin-endトランザクションブロックを開き、プリンシパル内のTempテーブルのinformacionに格納されているデータベースに影響を与えます。

私のプリンシパルストアは次のように表示されます:これは私がこれを行うための最良の方法ですか?

create proc spTest
as
/*Some processes here, temporary tables, etc...*/
begin try
begin distributed transaction
sp_nested1
sp_nested2
sp_nested3
sp_nested4
sp_nested5
sp_nested6
sp_nested7
sp_nested8
/*more processes here, updates, deletes, extra inserts, etc...*/
commit transaction
end try
begin catch
rollback transaction
DECLARE @ERROR VARCHAR(3000)
SELECT @ERROR = CONVERT(VARCHAR(3000),ERROR_MESSAGE())
RAISERROR(@ERROR,16,32)
RETURN
end catch

各ネストされたストアドプロシージャの基本的な構造は同じですが、唯一のそれぞれが、独自のtryおよびcatchブロックがあり、他のPROCを呼び出すことはありません。

任意の助けが本当に理解されるであろう...イムは使用したバージョンは、SQL Server 2005の

で物事が遅いとき、問題がで可能性があります....事前に

+7

呼び出す手順は問題ではありませんが、その手順は問題の可能性が最も高いです。これを解決するために必要な情報の1%しか提供していません。たとえば、あなたが4つのドアを持つ赤い車を持っていると言いましたが、それはうまく始まりません。どのようにして、与えられた情報で車の問題を診断することができますか? –

+1

+1 @KM - OPが考えていることはおそらくそうではないでしょうか、そうでなければ彼はSOの助けを求めないでしょう! :) – JNK

+0

まあ最初の段落では、それぞれのネストされたプロシージャが何をしているのかを説明しています。 "彼らのそれぞれは、古い情報と新しい情報を比較して、DataBaseの物理テーブルを見つけた後に情報を処理します。"申し訳ありませんが、明らかではない場合は...しかし、私はもっと情報を提供することはできません..たぶん私はあなたの情報を取得することができますテーブルやデータベースのさまざまなテーブルから一時テーブルにして、他のテーブルから。次のコメントに続き..... – Alejandro

答えて

2

最初にあなたのすべてをありがとう何を書きましたか。最初に見るのは、それぞれのストアドプロシージャの実行計画です。あなたはテーブルスキャンを持っていますか?

あなたはそれぞれを個別に実行し、それぞれの速さを見ましたか?これは、問題が8個のprocsかどうかを定義するのに役立ちます。あなたはこれに関連する多くのステップを持っているように見えますが、procsは問題になるかもしれません。

カーソルまたはループまたはスカラーのユーザー定義関数または相関サブクエリを使用して行単位でデータを処理していますか?これは速度に大きく影響する可能性があります。正しいインデックスを作成していますか?あなたのクエリステートメントsargableですか?私はあなたが分散トランザクションを参照してください、あなたは、procを実行しているユーザーは、他のサーバーで正しい権利を持っていることを確認ですか?そして、サーバーが存在し、実行されていますか?あなたは一時的なデータベースの部屋を使い果たしていますか?複数のサーバーで数百万のレコードを更新するのではなく、一括して実行する必要がありますか?

この混乱を見ることなく、何が遅くなっているのかを判断するのは難しいです。

しかし、私は長い複雑なprocsで動作する方法を共有します。まず、すべてのテスト変数を使用して、最後にトランザクションをロールバックして、正しいアクションが起こっていることを確認します。私はまた、ロールバックを行う前に私が挿入した結果を返します。今、これは当初、スピードの問題を助けるつもりはありません。しかし、実行計画から問題が何であるか把握できない場合、おそらく実行したいのは、最初のステップ以外のすべてをコメントアウトし、procをテストモード(およびロールバック)で実行してからあなたはそれが固まっているものを見るまでステップを追加し続けます。もちろんそれは複数かもしれない。

関連する問題