当前位置: 代码迷 >> Sql Server >> 一个存储过程几个月还没搞定,求SQL好手
  详细解决方案

一个存储过程几个月还没搞定,求SQL好手

热度:21   发布时间:2016-04-24 09:03:51.0
一个存储过程几个月还没搞定,求SQL高手
SQL Server 2008 R2数据库,有个存储过程,隔断时间就会查询超时,但是在慢的时候时候,在SQL Server Managment Studio里面直接调用是很快的,就是通过程序调用比较慢,.net程序,使用SqlHelper访问,查询返回DataSet,
每次解决都是通过将那个存储过程重新编译,查询速度立刻就快了很多,涉及表的数据量在几十万左右,索引都有建立。
还有个问题就是,这个存储过程有个参数,在慢的状态下,传0过去还是很快的,唯独传1过去查询很慢。
小弟对SQL优化也是略知一二,看了重新编译之前和之后的查询计划,是一样的,实在想不出问题出在哪里,出来SQL Server 板块,请坛子里高手指点。
------解决思路----------------------
可能受数据分布的影响,你可以考虑

ALTER PROC  NAME   WITH RECOMPILE

这样是使每次都重新编译
------解决思路----------------------
如果在SSMS,传入1,执行速度还是很快,那就很可能是.net和SQL之间的带宽不够
可以把SQL大致代码贴出来,帮你分析看看
------解决思路----------------------
楼主,你的 case 语句太奇葩了,完全不需要嵌套使用的, 一个就可以带多个 when 和 then, 头晕了
------解决思路----------------------
(M.OrderType=@OrderType or (@OrderType=0 and M.OrderType=2)) 

这句相当于:
@OrderType=0:
=>M.OrderType=0 or (0=0 and M.OrderType=2)    =>M.OrderType=0  or M.OrderType=2

@OrderType=1:
=>M.OrderType=1  or (1=0 and M.OrderType=1)   => M.OrderType=1  or 0  =>  M.OrderType=1 

@OrderType=2:
=>M.OrderType=2  or (2=0 and M.OrderType=2)  => M.OrderType=2  or 0 =>  M.OrderType=2

所以可以简化
------解决思路----------------------

让这个存储过程在每次运行时,自动编译:

create procedure dbo.xxxx 
with recompile
.......
------解决思路----------------------
引用:
Quote: 引用:


让这个存储过程在每次运行时,自动编译:

create procedure dbo.xxxx 
with recompile
.......

嗯 请问能解释一下原因吗 是因为如楼上所说的因为数据分布的问题?


对,数据分布。

另外,可能是统计信息没有及时更新了
------解决思路----------------------
引用:
Quote: 引用:

查看下缓存中的执行计划,是不是缓存了多个相同的执行计划?说不定用的不是同一个,那就规范写法了。

缓存的执行计划有7W多个,该怎么查看呢?


like 其中一行sql,只要能唯一识别是这个存储过程就像
like '%into #tmp_result %'



------解决思路----------------------
只是典型的参数嗅探问题.
如果不用存储过程级别的recomplie,可以使用语句级别的OPTION(RECOMPILE).
还有就是你的参数类型,要和数据表中的数据类型一样,如果都是窄类型的数据类型integer类型之类的话,尽量不要用varchar类型来传参数,会导致隐式转换,大大降低的查询语句的执行效率。
  相关解决方案