首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在运行查询时和在存储过程中运行该查询时使用不同的执行计划的sql?

在运行查询时和在存储过程中运行该查询时使用不同的执行计划的sql?
EN

Stack Overflow用户
提问于 2012-10-09 13:20:53
回答 1查看 1.4K关注 0票数 0

我有个疑问,

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

现在!,当我运行这个

代码语言:javascript
运行
复制
exec sp_newbooking
@flag = 32,
@Branchid = 1

执行计划显示的是6步骤!这是图片..!

请参见查询4

为什么在从过程执行时要执行6步来执行相同的查询,而单独执行时则执行3步?这是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-09 16:20:22

SQL可以使用不同的执行计划有很多原因。它可以是:

  • 相同查询的不同参数(在第一个示例中使用常量,第二个查询中的查询可能有不同的值)
  • 不同的数据(意味着您正在开发和生产上运行查询)
  • 参数嗅探-更多下面,但首先通过的过程可能有‘想要的’参数
  • 不同的数据类型--正如@MartinSmith所指出的,我们看不到参数声明。您可以有一个变量,它与匹配的字段类型不匹配。

参数嗅探

存储过程做'参数嗅探‘,这是一个祝福(如果它对您有效)和诅咒(如果它对您有效)。首先,有人在Zebr%上搜索零布朗斯基。姓氏索引意识到这是非常具体的,并将返回,比方说,3行从一百万-所以一个执行计划是建立。在为低行结果编译proc之后,下一次搜索是针对S%。嗯,S是您最常用的名称,它匹配100万行中的93,543行。

,那么你能做什么?

你可以采取很多步骤来检查这个.

  • 仔细查看变量数据类型,比较您的ad查询、proc和基础表(sp_columns mytable)。
  • 分离移动部件
    • 确保您使用相同的数据在同一个系统中运行两个查询
    • 进行跟踪运行,以确保proc的第一次运行使用预期的参数。
    • 尝试使用几个不同的参数运行广告霍克查询,看看执行计划是如何变化的。
    • 如果无法隔离活动,请暂时将WITH RECOMPILE添加到proc以比较执行计划。或者,在运行之前执行一个DBCC FREEPROCCACHE。(免责声明-如果这是一个活动系统,请确保您了解这些系统将做什么)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12801011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档