当前位置: 代码迷 >> Sql Server >> 存储过程中使用参数跟变量作为查询条件对性能的影响
  详细解决方案

存储过程中使用参数跟变量作为查询条件对性能的影响

热度:211   发布时间:2016-04-24 08:44:36.0
存储过程中使用参数和变量作为查询条件对性能的影响?

今日匆忙中写了2各存储过程,查询的表,查询的结构,返回的值基本一样,就是对参数的使用有点不同。

晚上到家想着优化下,看看能不能合并了。在几次重写后,拿着几个版本查看执行计划时,发现个以前没注意的问题。

第一个SP传入的2个时间参数直接用于里面的查询条件。

第二个SP传入的2个时间参数,在SP内又定义了2个时间变量,将参数通过简单计算后Set给了2个变量,然后在查询中使用这2个变量作为条件。

这2个SP,在执行开销上相差数倍。

在外面套一层SP,把时间算好了再当参数传给第二个SP,修改SP直接使用参数作为查询的条件,2个SP的开销就一样了。

这是怎么回事呢,SP里面对参数和变量的使用会对性能有多大的影响呢?

暂时没时间去仔细了解和分析。

 

希望看到的朋友不吝赐教。

 

2楼wy123
一定是第一种方式效率高!,,楼主不了解sqlserver的编译过程,sqlserver第一次编译的时候,是受传递进去的参数影响的,,你第一个SP传递进去的参数直接写在sql中,数据库引擎编译的时候是按照你传递进去的参数进行编译的,‘,换句话说,是在你传递进去的参数的基础上做最优化处理。,,第二种方式因为你再sp中对参数做了处理,编译的时候数据库引擎不知道经过计算过的值,(也就是参数通过简单计算后Set给了2个变量)是多少,是按照一种通用(有可能是低效)的方式来生成执行计划的,,这也就是这两种方式的区别,其实第三种方式和差别的本质和上面是一样的
1楼wy123
但是不要武断地理解我说第一种方式好就一定按照第一种方式的写法去做(我是说在你这里非全面测试用例测试的情况下),第一种方式也存在一个非常大的问题,,因为缓存的存储过程的执行计划是按照第一次传递进去的参数编译的,理论上,如果该执行计划没有被清除之前,后继所有传递进来的参数都是按照第一种方式去执行,问题很明显,如果参数不一样,最优的执行计划可能也是不一样的,,但是这里缓存了一个执行计划,后继SP的执行不管是什么参数都只能按照第一次编译生成的执行计划去执行,肯定会存在问题的,,对于这种问题解决办法太多了,感觉一两句话说不清,有兴趣可以看看《sqlserver企业级平台管理实践》中优化的那一章,我就不码字了,
  相关解决方案