关于sql server 语句在存储过程执行比直接执行慢的原因

问题场景

在sqlserver上直接执行一个查询和插入的语句只需20来分钟,
在存储过程执行居然要4个多小时,这能忍?

原因

在SQL Server中有一个叫做 “Parameter sniffing”的特性。SQL Server在存储过程执行之前都会制定一个执行计划。
如果SQL在编译的时候并不知道参数的值是多少,那么它在执行执行计划的时候就要会进行大量的猜测。
假设传递给参数大部分都是非空字符串,而FACT表查询的字段中有40%都是null,
那么SQL Server就会选择全表扫描而不是索引扫描来对参数制定执行计划。
全表扫描是在参数为空或为0的时候最好的执行计划。但是全表扫描严重影响了性能。

简单概括就是,要给查询的参数设限制(尤其是允许参数为空的情况),不要让它放飞自我

解决办法

解决的办法有几种,其中一种最简单的办法是进行参数替换
把存储过程内定义一个参数去顶替存储过程的输入参数
CREATE PROCEDURE [dbo].[proc_test]
@var_thedate VARCHAR(30)=''
AS
BEGIN
    declare @THEDATE VARCHAR(30)
    IF @var_thedate = '' or @var_thedate IS NULL
    BEGIN
       SET @var_thedate=CONVERT(VARCHAR(30),GETDATE()-1,112);
    END
    SET @THEDATE=@var_thedate;
    select * FROM test WHERE THEDATE=@THEDATE;
END

参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值