我有个疑问,
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步?这是什么?
发布于 2012-10-09 16:20:22
SQL可以使用不同的执行计划有很多原因。它可以是:
参数嗅探
存储过程做'参数嗅探‘,这是一个祝福(如果它对您有效)和诅咒(如果它对您有效)。首先,有人在Zebr%上搜索零布朗斯基。姓氏索引意识到这是非常具体的,并将返回,比方说,3行从一百万-所以一个执行计划是建立。在为低行结果编译proc之后,下一次搜索是针对S%。嗯,S是您最常用的名称,它匹配100万行中的93,543行。
,那么你能做什么?
你可以采取很多步骤来检查这个.
WITH RECOMPILE添加到proc以比较执行计划。或者,在运行之前执行一个DBCC FREEPROCCACHE。(免责声明-如果这是一个活动系统,请确保您了解这些系统将做什么)。
https://stackoverflow.com/questions/12801011
复制相似问题