好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQLServer性能优化之T-SQLNOTIN和NOTExists

这次介绍一下T-SQL中Not IN 和Not Exists的 优化 。 Not IN 和 Not Exists 命令 : 有些情况下,需要select/update/delete 操作孤立数据。孤立数据:不存在主表中而存在其关联表中。 操作这样的数据,一般第一反应是利用Not in 或 Not Exists命令。使用Not IN

这次介绍一下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 'Company_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 好很多。 不管你信不信,反正我信了!!!

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

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

查看更多关于SQLServer性能优化之T-SQLNOTIN和NOTExists的详细内容...

  阅读:43次