0

私はこのクエリを持っています、

Declare @Prcocessrate float
declare @item varchar(20)
declare @process varchar(20)
declare @branch varchar(20)
set @item = 'shirt'
set @process = 'kt'
set @branch = '1'
select @Prcocessrate =  ProcessPrice from itemwiseprocessrate where itemname=@Item and Process=@process and branchid=@branch

片手で実行すると、実行プランには3つのステップしか表示されません。自分で確認してください。

ここに画像の説明を入力してください

しかし、私はこれを持っていprocedure sp_newBookingます

ALTER PROC sp_newbooking
-- other arguements--
AS
BEGIN

--OTHER FLAGS--

ELSE IF (@Flag = 32)
        BEGIN

            declare @ItemId varchar(max),@ProcessRate float
            --set @BranchId='1'
            select @ProcessCode = DefaultProcessCode from mstconfigsettings where branchid=@BranchId
            select @ItemId= DefaultItemId from mstconfigsettings where branchid=@BranchId
            select @ItemName=  ItemName from itemmaster where itemid=@ItemId and branchid=@BranchId
            select @ProcessRate =  ProcessPrice from itemwiseprocessrate where itemname=@ItemName and ProcessCode=@ProcessCode and branchid=@BranchId
            if(@ProcessRate is not null)
            select @ItemName as ItemName,@ProcessCode as ProcessCode,@ProcessRate as ProcessRate
            else
            select @ItemName as ItemName,@ProcessCode as ProcessCode,'0' as ProcessRate
        END

-- OTHER FLAGS --


END

今!、これを実行すると

exec sp_newbooking
@flag = 32,
@Branchid = 1

実行計画は6つのステップを示しています!これが写真です..!クエリ4
を参照してください

プロシージャから実行するときに同じクエリを実行するのに6つのステップを実行するのに、単独で実行するときに3つのステップを実行するのはなぜですか?これはいったい何なのですか?

4

1 に答える 1

1

SQLがさまざまな実行プランを使用できる理由はたくさんあります。かもしれない :

  • 同じクエリに対して異なるパラメータ(最初の例では定数を使用しますが、2番目のクエリでは値が異なる場合があります)
  • さまざまなデータ(開発と本番でクエリを実行していることを意味します)
  • パラメータスニッフィング-以下で詳しく説明しますが、最初にプロシージャを渡すと、「目的の」パラメータが含まれる場合があります
  • さまざまなデータ型-@MartinSmithが指摘しているように、パラメーター宣言は表示されません。照合対象のフィールドのタイプと一致しない変数が含まれている可能性があります。

パラメータスニッフィング
ストアドプロシージャは、「パラメータスニッフィング」を実行します。これは、祝福(それがあなたのために働く場合)と呪い(それがあなたに対して働く場合)です。最初に誰かがZebr%zerbrowskiを検索するパス。姓のインデックスは、これが非常に具体的であり、たとえば100万から3行を返すことを認識しているため、1つの実行プランが作成されます。低い行の結果のためにコンパイルされたprocを使用して、次の検索はS%。さて、Sはあなたの最も一般的な名前であり、100万のうち93,543行に一致します。

それで、あなたは何ができますか?
これを検査するために実行できる手順はたくさんあります。

  • 変数のデータ型を注意深く調べ、アドホッククエリ、proc、および基になるテーブル(sp_columns mytable を比較します。
  • 可動部品を分離する
    • 同じシステムで同じデータを使用して両方のクエリを実行していることを確認してください
    • トレースを実行して、procの最初の実行で期待されるパラメーターが使用されていることを確認します
    • いくつかの異なるパラメーターを使用してアドホッククエリを実行し、実行プランがどのように変化するかを確認してください。
    • アクティビティを分離できない場合は、一時的にWITH RECOMPILEprocに追加して、実行プランを比較します。または、実行するDBCC FREEPROCCACHE直前に実行します。(免責事項-これがライブシステムである場合は、これらが何をするかを理解していることを確認してください)。
于 2012-10-09T16:20:22.480 に答える