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

  

,,,,,,,,

参数闻问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象。想必熟悉数据的同学都应该知道,产生参数嗅最典型的问题就是使用了参数化的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

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