参数嗅探的问题

原因:(1)可能是发生了参数嗅探,第一次赋给存储过程的输入参数,会为该存储过程生成一个基于输入参数的执行计划,因此如果第一次输入的参数不具有代表性(例如大部分查询输入的参数都是A值,但第一次执行存储过程时输入的是B值),就有可能比即席查询慢,尽管即席查询需要重新编译执行计划,但选择了更有效率的计划。
尝试使用和即席查询一样的参数,来执行存储过程,然后对比一下两者的执行计划。
(2)通常存储过程最上面有自带的set设置,如set ansi_nulls on,而即席查询通常没有包含,这些set设置也会影响执行计划。
尝试在即席查询中添加上,与存储过程一样的set设置,然后再对比一下执行计划。

解决方案:

1)通过使用declare声明的变量来代替参数:使用set @variable=@thedate的方式,将出现@thedate的sql语句全部用@variable来代替。

(2)  将受影响的sql语句隐藏起来,比如:

a)      将受影响的sql语句放到某个子存储过程中,比如我们在@thedate设置成为今天后再调用一个字存储过程将@thedate作为参数传入就可以了。

b)      使用sp_executesql来执行受影响的sql。执行计划不会被执行,除非sp_executesql语句执行完。

c)      使用动态sql(”EXEC(@sql)”来执行受影响的sql。

sql存储过程比sql语句执行慢很多的更多相关文章

  1. 关于sql和MySQL的语句执行顺序(必看!!!)

    今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及My ...

  2. 关于sql和MySQL的语句执行顺序

    sql和mysql执行顺序,发现内部机制是一样的.最大区别是在别名的引用上. 一.sql执行顺序 (1) from (3) join (2) on (4) where (5) group by(开始使 ...

  3. (转)关于sql和MySQL的语句执行顺序(必看!!!)

    原文:https://blog.csdn.net/u014044812/article/details/51004754 https://blog.csdn.net/j080624/article/d ...

  4. 执行sql查询,并查看语句执行花费时间

    declare @d datetimeset @d=getdate() select * from A PRINT '[语句执行花费时间(毫秒)]'+LTRIM(datediff(ms,@d,getd ...

  5. SQL中的动态语句执行--exec(@sqlstr)

    begin drop table #tmptable declare @money ut_money set @money=1.2345 create table #tmptable ( je ut_ ...

  6. 45、SQL逻辑查询语句执行顺序

    一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...

  7. 9、SQL逻辑查询语句执行顺序

    本篇导航: SELECT语句关键字的定义顺序 SELECT语句关键字的执行顺序 准备表和数据 准备SQL逻辑查询测试语句 执行顺序分析 一.SELECT语句关键字的定义顺序 SELECT DISTIN ...

  8. sqlServer存储过程与sql语句的区别

    sqlServer   存储过程与sql语句的区别 sql存储过程与sql语句的区别: 从以下几个方面考虑: 1.编写: 存储过程:编写比较难: sql语句:相对简单: 2.性能: 存储过程:高,可移 ...

  9. SQL语句执行性能

    通过设置STATISTICS我们可以查看执行SQL时的系统情况.选项有PROFILE,IO ,TIME.介绍如下: SET STATISTICS PROFILE ON:显示分析.编译和执行查询所需的时 ...

随机推荐

  1. 无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错

    原文:无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错 无法安装MVC3,错误提示:安装KB2483190(vs10-kb2483190)出错. 安装指导:&qu ...

  2. 更改ubuntu多系统启动顺序

    电脑上双系统,启动时界面如下 ubuntu advance ubuntu option windows 在/boot/grub/grub.cfg中,查看到可以简单的修改/etc/defaulg/gru ...

  3. 5.首次登陆与在线求助man page

    X Window与命令行模式的切换:通常我们也称命令行模式为终端界面(terminal或console),linux默认的情况下会提供6个Terminal来让用户登录,切换的方式为使用[Ctrl]+[ ...

  4. LVM 'Can’t open /dev/sdb1 exclusively. Mounted filesystem?' Problem

    服务器做mysql时候,添加的新磁盘做lvm时候,创建物理卷报错 saltstack_s:/proc/scsi # cat /proc/partitions major minor #blocks n ...

  5. Javascript Promise入门

    是什么? https://www.promisejs.org/ What is a promise? The core idea behind promises is that a promise r ...

  6. LUA table学习笔记

    function printT( ... ) for i,v in ipairs(...) do print(i,v) end end t1={} t2={} t3={} table.insert(t ...

  7. (转)小心FPGA的JTAG口(上电和下电顺序)

    同志们,根据ALTERA官方FAE(现场应用工程师)的强烈建议,请注意不要随意带电插拔你的JTAG下载接口,否则会损坏FPGA芯片的JTAG口信号管脚.现象:在排除了下载线的问题后,还是不能访问FPG ...

  8. HTML5的Server-Sent Events介绍////////////////zzz

    HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据推送).我们来看下,传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有A ...

  9. JavaSE基础第一篇

      1.JDK的安装: 包括JRE 和JVM   下载地址: www.oracle.com/www.sun.com 2.环境变量 set path = "bin所在路径" 设置pa ...

  10. Flex 布局2

    Flex 布局2     你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我只列出代码,详细的语法解释请查阅<Flex布局教程:语法篇>.我的主要参考资料是Landon Sch ...