分享一个SQL 不等于运算 <>的优化方法,希望大家也分享一下技巧。
其实标题有点噱头了,主要过程就是,先选取没有用 <> 操作符过滤的数据,然后再在选出的集合中删除特定数据。
事情是这样的:
公司有个最大的表,大概近300万条数据,由于结构合理,平时操作的时候,都可以忽略延时,都是0秒的操作时间。
后来新建了一个存储过程,里面有一个where的条件是某列不等于一个值,并且有2处含有这样的运算,运行时间尽然到了14秒,因为这个存储过程的调用很少,1天也没有几次,所以也没有人注意到这个问题。但是近期有时候就出现数据在给入的时候出现莫名其妙错误,最后就找到了这个存储过程上了。
就像前面说的,这个存储过程在选取数据的时候,使用了 <> 操作符,所以会进行全表扫描,非常耗时。更改之后的样式是先选取不带<>条件的所有数据到表变量,然后再从表变量删除特定数据。应该也可以用with代替,但是这个语句会在2个地方使用,所以用了表变量。现在的运行时间是0秒了。有点小成就。^_^
在网上找了很长时间有关<>的优化,但是都没有结果。如果有朋友也有这样的困惑,也许可以试试我的笨办法。
提示:
如果你选取的数据不多的时候,可以使用表变量。
如果数据多,可以考虑建立一个带有index的临时表。
假如只有一处使用了<>的操作,可以考虑使用嵌套的with语句。
:)
------解决方案--------------------------解决方案--------------------很有用,欣赏楼主的分享精神。
------解决方案--------------------------解决方案--------------------支持分享。
------解决方案--------------------
该回复于2012-07-04 08:20:00被版主删除
------解决方案--------------------坚定领悟楼主的正确思想