2

いくつかのパラメーターを使用する次のサンプル プロシージャを検討してください。

Create Procedure CustomerSearch(
@Name       nVarChar(100) = Null,
@Phone      nVarChar(100) = Null,
@Address    nVarChar(100) = Null,
)
As

Select  *
        From    dbo.CustomerView
        Where   (@Name      is Null or Name     =   @Name)  And
                (@Phone     is Null or Phone    =   @Phone) And
                (@Address   is Null or Address  =   @Address)

パラメータの値がnullになる可能性があるため、それを処理するための2つの解決策を見つけました。

  1. 次のように使用または条件付けします: (@Name is Null or Name = @Name)
  2. 動的 SQL を使用し、パラメーター値が null でない場合にクエリに条件を追加します。

CustomerView ビューには複数のテーブル結合が存在し、このテーブルには大量のデータが含まれており、パフォーマンスが非常に重要です。ソリューション 1 にはオーバーヘッドがあります (実行計画)。何らかの理由で、動的 sql を使用できません。このクエリを作成するより良い方法はありますか?

Name = @Name の代わりに条件 @Name is Null または Name = @Name) を使用して実行プランを表示すると、インデックスのシーク コストが増加します。

4

3 に答える 3

2

上記のコードは完全に受け入れられます。パフォーマンスが問題になる場合は、Name、Phone、および Address 列にインデックスがあることを確認してください。

于 2013-02-07T17:50:14.610 に答える
2

あなたのコードは正常に動作します。あなたの場合、パラメーターを NULLIF(@Parameter,'') でラップして、空白が比較されないようにします。

クエリを記述する別の方法もあります。パラメーターが空白または null の場合、列を常に true であるそれ自体と比較します。

Name = COALESCE(NULLIF(@Name,''),Name)

http://sqlfiddle.com/#!3/4ff42/1

于 2013-02-07T18:40:04.923 に答える
1

OPTION (RECOMPILE) ストアド プロシージャの最後に追加することも検討してください。

ストアド プロシージャが SQL Server で初めて実行されるときはいつでも最適化され、クエリ プランがコンパイルされて SQL Server のメモリにキャッシュされます。

MSDN の記事から:

RECOMPILE
クエリの実行後に生成されたプランを破棄するように SQL Server データベース エンジンに指示し、次に同じクエリが実行されるときにクエリ オプティマイザーにクエリ プランを強制的に再コンパイルさせます。RECOMPILEを指定しない場合、データベース エンジンはクエリ プランをキャッシュして再利用します。クエリ プランをコンパイルするとき、RECOMPILEクエリ ヒントはクエリ内のすべてのローカル変数の現在の値を使用し、クエリがストアド プロシージャ内にある場合は、パラメーターに渡された現在の値を使用します。
再コンパイルこれは、ストアド プロシージャ全体ではなく、ストアド プロシージャ内のクエリのサブセットのみを再コンパイルする必要がある場合に、WITH RECOMPILE 句を使用するストアド プロシージャを作成する代わりに便利です。詳細については、ストアド プロシージャの再コンパイルを参照してください。RECOMPILEは、プラン ガイドを作成するときにも役立ちます。

于 2013-02-07T18:52:23.163 に答える