SQL Server 性能优化之——T-SQL NOT IN 和 NOT Exists

长平狐 发布于 2013/06/17 13:02
阅读 4K+
收藏 0

这次介绍一下T-SQL中“Not IN” 和“Not Exists”的优化。

 

Not IN Not Exists 命令 :

有些情况下,需要select/update/delete 操作孤立数据。孤立数据:不存在主表中而存在其关联表中。

操作这样的数据,一般第一反应是利用“Not in” 或 “Not Exists”命令。使用Not IN会严重影响性能,因为这个命令会逐一检查每个记录,就会造成资源紧张,尤其是当对大数据进行更新和删除操作时,可能导致资源被这些操作锁住。

.

选择NOT IN 还是 NOT Exists

现在SQL Server 中有两个命令可以使用大数据的插入、更新、删除操作,不仅性能方面比NOT IN 和 NOT Exists有很大的提高,而且语法简单,写出来的语句看上去也很清爽。 现在就请它们闪亮登场,Merge 和 Except。

例子:

首先创建两个表

   1:  use [MyTest]
   2:  Create table Test1 (name varchar (100) )
   3:  Create table Test2 (name varchar (100) )

 

使用Not IN命令Select/update/delete操作:

   1:  SELECT name FROM Test1 where name not in (select name from Test2)
   2:  UPDATE Test1 SET name =N'New_Name' where name not in (select name from Test2)
   3:  DELETE Test1 FROM Test1 where name not in (select name from Test2)

 

使用性能更好的Merge and Except

   1:  merge Test1 T using (select name from Test1 except select name from Test2 )S on t.name=s.name
   2:  when matched then update SET name=N'New_Name' ;
   3:  merge Test1 T using (select name from Test1 except select name from Test2 )S on t.name=s.name
   4:  when matched then delete ;
   5:  SELECT * FROM Test1 S where not exists (select 1 from Test1 inner join Test2 on Test1.name=Test2.name and Test1.name=s.name)
 

 

注意,上面还是有一部分使用了Not Exists:

   1:  SELECT * FROM Test1 S where not exists (select 1 from Test1 inner join Test2 on Test1.name=Test2.name and Test1.name=s.name)

 

现在需要使用高效的Except:

   1:  select name from Test1 except select name from Test2

 

在这里只是给出了例子,没有拿出实际的对比数据。但是Merge 和Except 两个命令在大数据的处理方面的性能,要比

Not IN 和Not EXISTS 好很多。不管你信不信,反正我信了!!!

 

 敬请期待测试数据

在此谢谢读完这篇博客,有什么写的不对的地方请指正

 

有帮助就推荐下,有感想就下下来,不满意就留言,有问题就更正。

 


原文链接:http://www.cnblogs.com/BoyceYang/archive/2013/06/17/3139587.html
加载中
返回顶部
顶部