位置: 编程技术 - 正文

SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的快速解决方法(sql参数是什么意思)

编辑:rootadmin

推荐整理分享SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的快速解决方法(sql参数是什么意思),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sql中如何实现参数的操作,sql中如何实现参数的操作,sql参数是什么意思,sql参数设置,sqlserver参数化查询,sql参数是什么意思,sql server 参数,sql参数设置,内容如对您有帮助,希望把文章链接给更多的朋友!

parameter sniff问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象。想必熟悉数据的同学都应该知道,产生parameter sniff最典型的问题就是使用了参数化的SQL(或者存储过程中使用了参数化)写法,如果存在数据分布不均匀的情况下,正常情况下生成的执行计划,在传入在分布数据较多的参数的情况下,重用了正常参数生成的执行计划,而这种缓存的执行计划并非适合当前参数的一种情况。

这种情况,在实际业务中,出现的频率还是比较高的,因为存储过程一般都是采用参数化的写法,这时,遇到分布不均匀的数据参数时,parameter sniff现象就出现了,这种问题还是比较让人头疼的。

具体parameter sniff产生的原因,我就不做过多的解释了,解释这个就显得太low了

我举个简单的例子,模拟一下这个现象,说明参数化的存存储过程是怎么写的,存在哪些问题,又如何解决parameter sniff问题,

先创建一个测试环境:

参数化存储过程的写法:

在编写存储过程的时候,我们一般建议采用参数化的写法,目的是为了减少存储过程的编译和加强执行计划缓存的重用

大概是这样子的

Parameter Sniff问题:

这就潜在一个parameter sniff问题,

比如我查询用户ID=的订单信息,一个正常的分布的数据,存储过程第一次编译,这个执行计划完全没有问题,

如果我接着改变参数执行查询用户的信息,一个分布及其不均匀的数据,但是因为重用上面缓存的执行计划,就出现parameter sniff问题了,这个执行计划显然是不合理的

IO就不看了,刻意造的例子

如果我清空执行计划缓存,重新执行上述查询,因为有了重编译,执行计划就是不这个样子,对于CustomerID=这个参数来说,显然走全表扫描代价要更小一点

想必这是一个开发中常见的问题给,我们参数化SQL就是为了让不同参数的查询重用执行计划,但是很不幸,数据分布不均匀的时候,重用执行计划恰恰又给数据库造成了伤害,例中,如果是正常参数重用了分布较多数据的执行计划,比如命名可以用到索引,结果是表扫描,后果会更严重。

那么,既想要尽可能的重用执行计划,又要避免因为执行计划重用产生parameter sniff问题,怎么办?

我们知道问题在于@p_CustomerId身上,那么可不可以对有可能产生parameter sniff问题的@p_CustomerId不做参数化,直接拼凑在SQL中,如果@p_CustomerId变化了就重编译SQL,也就是对传入进来的@p_CustomerId重编译

如果是@p_CustomerId不变,其他参数有变化,比如这里时间字段的变化,还可以享受参数化带来的执行计划重用的好处 也就是这样处理 @p_CustomerId这个参数,直接把@p_CustomerId以字符串的方式平凑在SQL语句中,这样的话,就相当于即席查询了,不通过参数化的方式给CustomerId这个查询条件字段赋值

这样再去执行存储过程的时候,

带入@p_CustomerId=1的时候,执行IDX_CustomerId的index seek

SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的快速解决方法(sql参数是什么意思)

带入@p_CustomerId=的时候,重编译,执行计划是全表扫描,避免重用上面生成的执行计划,造成不合理的执行方式对效率以及数据库服务器资源的消耗

这样会尽可能的减少parameter sniff问题带来的影响,当缓存了@p_CustomerId=1的执行计划的时候,再次传入@p_CustomerId=1,其他条件有较小的变化,比如时间字段上有改动,依然可以重用缓存的执行计划,避免重编译带来的影响

结论:

这种方式于处理parameter sniff问题,当然不是完美的,肯定也有问题,我当然知道一旦@p_CustomerId不同就要重编译

肯定会因为@p_CustomerId参数值不同,这样的话,不可避免地增加了重编译的机会,

但是却不会因为不合理的执行计划重用,带来的parameter sniff问题

要知道一旦产生parameter sniff问题,大量的查询用到不合理的执行计划,会对整个服务器产生非常严重的影响,比如可能会产生大量的IO等

同时存在一个好处,比如第一次传入@p_CustomerId=1,

再次传入@p_CustomerId=1,其他条件有较小的变化,比如时间字段上有改动,依然可以重用缓存的执行计划,避免重编译带来的影响当然我这里只是一个简单的例子,实际应用中远远比这个复杂

比如分布的特别的多的数据有两个特点,第一分布的标示不仅仅只有一个,第二分布不均的数据是动态的,有可能第一季度是A这部分数据占据大多数,有可能是第二季度B数据占绝大多数

所以很难采用Plan Guide的方式解决parameter sniff问题

这种方式可以在一定程度上也能够重用缓存的执行计划,可以减少(但不可避免)重编译的次数

同时,这种方式与拼凑一个SQL字符串执行的即席查询方式相比,同时还可以利用参数化带来的其他好处,比如SQL注入等等

总结:

    parameter sniff问题的解决方式有很多,不一一??铝?br />

    最典型的就是强制重编译,

    或者使用EXEC执行一个拼凑出来的字符串,这种方式属于Adhoc查询

    或者查询提示,

    或者是使用本地变量,

    或者使用Plan Guide等等等等,

    每种方式都有他的局限性,至少到目前为止,还没有一种十全十美的方式来解决parameter sniff问题

    遇到问题,解决方法有很多种,以最小的代价解决问题才是王道。

SQL Server 正式版安装配置过程图文详解 本文针对SQL正式版安装过程进行梳理总结,帮助大家顺利安装SQL,具体内容如下1.点击全新安装2.接着就是下一步,下一步...3.选择你要安装的功能[

SQL Server CTP2.2安装配置方法图文教程 SQLServerCTP2.2安装配置教程下载一个iso文件,解压出来(大约2.8G左右),在该路径下双击Setup.exe即可开始安装。安装之前请先安装.NET3.5SP1,在服务器

SQLServer主键和唯一约束的区别 首先说明一点,主键又称主键约束,它也是一种约束,看下它和唯一约束的创建语法:altertablePersonaddconstraintPK_Idprimarykey(Id)altertablePersonaddconstraintUQ_Nameun

标签: sql参数是什么意思

本文链接地址:https://www.jiuchutong.com/biancheng/318910.html 转载请保留说明!

上一篇:MySQL 及 SQL 注入与防范方法(mysql数据库注入)

下一篇:SQL Server 2016正式版安装配置过程图文详解(sqlserver2016使用方法)

  • 无票收入后面附单据吗
  • 个人所得税全年一次性奖金优惠政策
  • 增值税税控系统产品及维护服务价格
  • 未交增值税借贷方负数表示
  • 质量赔偿款计入什么会计科目
  • 原材料入库进项税
  • 小微企业的资产总额看哪里判断的
  • 非生产性费用不应计入产品成本
  • 房地产可抵扣的税有哪些
  • 分公司注销后账户不注销可以吗
  • 一般纳税企业可以变更小微企业吗
  • 商标转让所需要的材料
  • 银行承兑汇票利息怎么算
  • 仓储部门折旧计入什么科目
  • 服务业的地税是什么税
  • 跨行发报
  • 什么是差额费用
  • 公司小汽车多少年报废
  • 企业取得的土地使用权用于出租或增值目的时
  • 企业的业务招待费多了好还是少了好
  • 预交增值税抵减申报
  • 小规模纳税人公司注销流程及费用
  • 购买汽车分期付款利息怎么算
  • 会员充值增送如何取消
  • 每月固定电话费是半固定成本吗
  • 工程款中包含增值税怎么处理
  • Win7系统Syswow64文件夹是什么及能否删除的相关内
  • 期初未缴纳税额负数
  • win10网络带宽
  • 公司出售已经提完折旧的机器
  • php递归函数的例子
  • 电脑语言栏不见了,打不出汉字
  • php怎么爬数据
  • Zinnowitz pier on Usedom island in the Baltic Sea, Germany (© Frank Günther/Getty Images)
  • uniapp按钮
  • 学生个人网站制作html代码
  • 销售黄金的消费税
  • 电子发票重开之前的是不是就没用了
  • 决算清理期和库款报解整理期
  • 如何做进项税额转出处理
  • 不动产简易征收增值税发票 可以抵扣
  • 支付宝支付高速公路发票怎么打印
  • 医疗机构销售药品是否征收增值税
  • 汽车维修公司做账基本流程
  • 小规模企业没有员工如何申报个税
  • 销项税进项税月末怎么处理
  • 电商平台收入何时到账
  • 未确认融资费用账务处理
  • 冲估价入库怎么冲成本
  • 应收管理费,做应收款处理会计分录
  • 工程预付款如何缴税
  • 公司注销后如何起诉他人
  • 股权稀释违法吗
  • 本月未过账的凭证怎么写
  • 本年利润的会计科目代码
  • 小规模纳税人注册资金要求多少
  • 交易性金融资产的入账价值
  • 当月发生的费用下月支付
  • order by使用
  • win7登录不了系统界面
  • xp系统开机自动运行程序
  • wp升级
  • win10防火墙打不开错误代码
  • xp系统java环境变量配置
  • windows1021h1新功能
  • 微软十周年
  • 电脑中毒蓝屏了怎么办修复
  • RedHatLinux AS3中APACHE+SendMail+OpenWebMail整合
  • vb6.0win10安装教程
  • Perl实现高水线算法(解决多值比较问题方法)
  • linux bash命令详解
  • shell脚本模拟ctrl
  • js 状态模式
  • javaScript parseInt字符转化为数字函数使用小结
  • javascript面向对象编程指南第三版
  • js获取鼠标点击位置
  • 晋城兰花集团招聘
  • 预缴增值税最后怎么处理
  • 国家税务总局中山市税务局港口税务分局
  • 上海房产税交易中心电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设