,,,,,,,,
参数闻问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象。想必熟悉数据的同学都应该知道,产生参数嗅最典型的问题就是使用了参数化的SQL(或者存储过程中使用了参数化)写法,如果存在数据分布不均匀的情况下,正常情况下生成的执行计划,在传入在分布数据较多的参数的情况下,重用了正常参数生成的执行计划,而这种缓存的执行计划并非适合当前参数的一种情况。
这种情况,在实际业务中,出现的频率还是比较高的,因为存储过程一般都是采用参数化的写法,这时,遇到分布不均匀的数据参数时,参数嗅现象就出现了,这种问题还是比较让人头疼的。
,
具体参数嗅产生的原因,我就不做过多的解释了,解释这个就显得太低了
我举个简单的例子,模拟一下这个现象,说明参数化的存存储过程是怎么写的,存在哪些问题,又如何解决参数闻问题,
,
先创建一个测试环境:
create table ParameterSniffProblem ( ,,,id int 身份(1,1), ,,,CustomerId int, ,,,OrderId int, ,,,OrederStatus int, ,,,CreateDate Datetime, ,,,Remark varchar (200)=)declare @i int 0 while @i<500000开始 ,,,INSERT INTO ParameterSniffProblem values (@i @i % 10000年,RAND() * 10,获取当前日期()RAND () * 100, NEWID ()),,,, set @i=@i + 1结束 ,假,如某一个客户有非常多的订单,模拟数据分布不均匀的情况INSERT INTO ParameterSniffProblem values (6666兰特()* 100000,1,获取当前日期()RAND () * 100, NEWID ()) GO 100000年,创建正常的索引CREATE CLUSTERED INDEX IDX_CreateDate 提醒ParameterSniffProblem (CreateDate) CREATE INDEX IDX_CustomerId 提醒ParameterSniffProblem (CustomerId)
,
,参数化存储过程的写法:
,
在编写存储过程的时候,我们一般建议采用参数化的写法,目的是为了减少存储过程的编译和加强执行计划缓存的重用
大概是这样子的
<>之前,,,,,,,,, ,,,,NOCOUNT ,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,(,,,,,,,,(),,N ,,,,,,,,,, ,,,,,,, ,(,,,,,CONCAT (,,,,,, CONCAT (,,,,,, CONCAT (,,,,,, CONCAT (,,, ,,,,,,, null