你的位置:首页 > 软件开发 > 数据库 > SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案

SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案

发布时间:2016-07-06 10:00:05
parameter sniff问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象。想必熟悉数据的同学都应该知道,产生parameter sniff最典型的问题就是使用了参数化的SQL(或者存储过程中使用了参数化)写法,如果存在数据分布不均匀的情况下,正常情 ...

SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案

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

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

 

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

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

 

先创建一个测试环境:

create table ParameterSniffProblem(  id int identity(1,1),  CustomerId int,  OrderId int,  OrederStatus int,  CreateDate Datetime,  Remark varchar(200))declare @i int = 0while @i<500000begin  INSERT INTO ParameterSniffProblem values (@i%10000,@i,RAND()*10,GETDATE()-RAND()*100,NEWID())  set @i=@i+1end --假如某一个客户有非常多的订单,模拟数据分布不均匀的情况INSERT INTO ParameterSniffProblem values (6666,RAND()*100000,1,GETDATE()-RAND()*100,NEWID())GO 100000--创建正常的索引CREATE CLUSTERED INDEX IDX_CreateDate on ParameterSniffProblem(CreateDate)CREATE INDEX IDX_CustomerId ON ParameterSniffProblem(CustomerId)

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案

关键词:sql

sql
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。