0

非常に大きなプロジェクトでSQLServer2000で作業することには制限があります。1つのモジュールに対して、3〜10個のストアドプロシージャを作成する必要があります。管理しやすくするために、次のような条件に基づいてさまざまなSQLクエリを返す1つのストアドプロシージャを作成しています。

If @QueryId = 'SelAllEmp'
   Select EmpId,EmpName from EMP 
ELSE IF  @QueryId = 'SelEmpById'
   Select EmpId,EmpName from EMP where EmpId= @EmpId
ELSE IF @QueryId = 'EMPDept'
   Select EmpId, DeptId, DeptName from EMPDept
......................................

私の質問は、この手法を使用した場合に隠れた結果や影響はありますか?

4

2 に答える 2

2

私はあなたがこれにアプローチしている方法はまったく管理できないと思います。質問で示したケースについては、それを1つのクエリにするように努める必要があります。カラムを使用するかどうかをクライアントに決定させます。クライアントにはそれを無視するオプションがあり、引数DeptNameを渡さなければならなかったため、無視することを知っています。EmpDeptクライアントがその列を無視できる場合、3つのクエリが1つになる可能性があります。

SELECT EmpId, EmpName, DeptName
  FROM dbo.EMP 
  WHERE EmpId = CASE 
    WHEN @QueryId = 'SelEmpById' THEN @EmpId ELSE EmpId END;

このクエリは、3つの条件すべてを解決します。悪い計画で立ち往生するのを避けるために、あなたは手順OPTION (RECOMPILE)にステートメントを追加することができます。 WITH RECOMPILEはい、これはオーバーヘッドを引き起こす可能性があります(Joonがそれを鳴らすほど悪くはありません)が、私は1日おきに恐ろしい計画に夢中になっていることを毎回少し編集します。既定では、SQL Server 2000は、単一のストアドプロシージャに対してすべてのパスを最適化することはできません。

もう1つのオプションは、動的SQLを使用して必要なクエリを作成することです。これにより、プランキャッシュが肥大化する可能性がありますが、すべてのオプションを頻繁に使用する場合は、それほど悪くはありません。サーバー設定を使用することで、これがプランキャッシュの肥大化の原因となる可能性のある問題を回避できます。optimize for ad hoc workloads

Erland Sommarskogによる2つの非常に価値のある読み物:

基本的に、動的SQLを恐れないでください。ただし、潜在的な問題に注意してください。

申し訳ありませんが、私の答えはSQL Serverの新しいバージョンを対象としていたため、戻ってきて編集しました。なんらかの理由で、まだSQLServer2000を使用している人がいることを思い出すのは難しいです。

于 2012-07-24T12:39:54.453 に答える
0

ストアドプロシージャが特定の複雑さを超えると、クライアントから呼び出されるたびに再コンパイルされます。

これによりサーバーにオーバーヘッドが発生し、ビジー状態のアプリでは、十分に発生した場合に全体的なパフォーマンスが低下する可能性があります。

これは、この手法に従うことによる潜在的な悪影響の1つです。

また、結果セットは、ストアドプロシージャへの入力に基づいて変更されます。これにより、特定のフィールドが存在するかどうかを期待するクライアントが破損する可能性があります。

于 2012-07-24T11:56:21.803 に答える