2016-12-09 2 views
0

多くのストアドプロシージャ、または複数のif-else支店を持つ1つのストアドプロシージャを持つことが良い場合、私は疑問に思って。マルチブランチの性能であればSQLにおけるステートメント(SQL Server 2008の)

ストアドプロシージャの最新の実行に基づいてSQL Serverが実行計画を作成するので、ストアドプロシージャが次に実行されるときに、IFステートメントの別のパスにつながる別のパラメータを使用して、異なる実行計画がコンパイルされ、キャッシュされます。

私の監督は、私たちの環境内のストアドプロシージャの数を減らしたいと言っており、私たちがデータを持っているさまざまな地域間でif-elseステートメントを使用するよう指示しました。 など。

if(@iso = 'Item1') 
begin 
    if(@type = 'A') 
    begin 
    end 
    if(@type = 'B') 
    begin 
    end 
    if(@type = 'C') 
    begin 
    end 
end 
if(@iso = 'Item2') 
begin 
    if(@type = 'A') 
    begin 
    end 
    if(@type = 'D') 
    begin 
    end 
end 
if(@iso = 'Item3') 
begin 
    if(@type = 'B') 
    begin 
    end 
    if(@type = 'E') 
    begin 
    end 
end 

このストアドプロシージャを実行すると、毎回異なるパラメータが送信される可能性が非常に高いです。これは、実行計画が常に再生成されているため、データベースの競合を引き起こすことになりますか?

+0

ストアドプロシージャの数を減らす目的は何ですか?あなたはそれから何を得るのですか?それが私が求めている最初のことです。 – mikeb

+0

私は、あなたの2つの手技のどちらが速いのかをあなたに伝えるためにインターネット上の人々を信頼しません。さまざまなパラメータで両方の方法で実行し、パフォーマンスの違いを自分で測定します。 –

+0

これは非常に乱雑に聞こえ、その手順を実行するすべてのプロセスを中断させる可能性があり、エラーを更新する必要があります。それを行うことから得ることは何もありませんが、パフォーマンスとメンテナンスの悪夢です。 – Siyual

答えて

0

私はそれぞれの意図や目的のために、単一のストアドプロシージャのために投票します。ほとんどの場合、ストアドプロシージャには1つの目的があります。意味あり。 「懸念の分離」またはSOLIDの設計原則を考えてください。また、保守が容易になります。より複雑で複雑なストアドプロシージャよりも、小さなストアドプロシージャを理解して変更する方がはるかに簡単です。あなたは上記のように複数のパラメータを持つ大規模なストアドプロシージャを実行すると

はスニッフィングパラメータと悪いプランのキャッシュの問題に対する予防策を取る必要があります。ここでは、問題を説明し、それについて何をすべきかよく分かる、Brent Ozarの素敵な記事です。 What is Parameter Sniffing?

+0

ありがとうございます。クレジット値を取得するには、ストアドプロシージャの単一の目的があります。ただし、地域ごとに5つの地域と2つの異なる商品タイプがあり、それぞれ独自のクレジット価値を持つことができます。値は、ソース・データがリージョンごとに異なるため、データベースの異なる表に保管されます。理想的には、すべてのデータが消去され正規化されたデータウェアハウスがありますが、これは将来を待たなければならないものです。 – TychoBrahe

+0

そのような状況のように聞こえるかもしれませんが、私は単一のストアドプロシージャを使用して、入力に基づいてSQLを動的に構築する傾向があります。おそらくいくつかのCTEまたはテーブル機能を活用するでしょうか?私は新しい情報で私の投票を変更しなければならないかもしれません。あなたの上司に同意する傾向があります。単一のソース(sproc)を使用してデータを取得し、アプリケーションのどこにデータを格納するかを決定する方がよいでしょう。最良のアプローチは、実際にはデータとビジネスロジックに依存します。 –

関連する問題