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

原文 http://www.cnblogs.com/BoyceYang/p/3139587.html

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

 

 敬请期待测试数据

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

 

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

时间: 2024-08-27 15:21:18

SQL Server 性能优化之——T-SQL NOT IN 和 NOT Exists的相关文章

Sql Server 性能优化之包含列

原文:Sql Server 性能优化之包含列 Sql Server 性能优化之包含列        导读:数据数优化查询一直是个比较热门的话题,小生在这方面也只能算是个入门生.今 天我们就讲下数据库包含列这个一项的作用及带来的优化效果           引用下MSDN里面的一段解释:        当查询中的所有列都作为键列或非键列包含在索引中时,带有包含性非键列的索引可以显 著提高查询性能. 这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值:不 访问表或聚集索引数据,从而减少磁盘

sql server 性能优化之nolock_MsSql

伴随着时间的增长,公司的数据库会越来越多,查询速度也会越来越慢.打开数据库看到几十万条的数据,查询起来难免不废时间. 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑.其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能. 不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read,就是读到无效的数据.

SQL Server 性能优化(一)——简介

原文:SQL Server 性能优化(一)--简介 一.性能优化的理由: 听起来有点多余,但是还是详细说一下: 1.节省成本:这里的成本不一定是钱,但是基本上可以变相认为是节省钱.性能上去了,本来要投入的硬件就可以减缓投入,从另外一个角度看来它就是节省了钱. 2.增加效率:对于客户来说,性能上去了,他们的工作效率也高了. 3.降低挫折感:性能底下,客户抱怨,无疑是对自己心灵上的打击. 二.性能误区: 误区 现实 如果处理器使用率很高,那么需要添加更快的处理器 某一部分导致了性能问题 80%的性能

sql server 性能优化之nolock

伴随着时间的增长,公司的数据库会越来越多,查询速度也会越来越慢.打开数据库看到几十万条的数据,查询起来难免不废时间. 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑.其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能. 不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read,就是读到无效的数据.

SQL Server 性能优化之——系统化方法提高性能

原文http://www.cnblogs.com/BoyceYang/archive/2013/06/15/3138142.html 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结   1. 概述 在比较大的范围内找出能够大幅提高性能的区域,并且专注于分析这个区域,这是最有效的优化SQL Server性能的方式.否则,大量的时间和精力可能被浪费在不能提高很大性能的区域.在这里并没有讨论关于多用户并发所带来的性

SQL Server 性能优化之——重复索引

原文 http://www.cnblogs.com/BoyceYang/archive/2013/06/16/3139006.html 阅读导航 1. 概述 2. 什么是重复索引 3. 查找重复索引 4. 删除重复索引 5. 总结   1. 概述 很多人都知道索引在数据库上的是有利有弊的.像其他主流商业数据库一样SQL Server允许在一个列上重复创建索引.因为SQL Server没有限制创建重复索引的数量,只是限制数据库的一个表上最多可以创建999重复索引,所以这就增加了数据库中存在重复索引

谈谈Tempdb对SQL Server性能优化有何影响_MsSql

先给大家巩固tempdb的基础知识 简介: tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分,用来存储临时对象.可以简单理解tempdb是SQLServer的速写板.应用程序与数据库都可以使用tempdb作为临时的数据存储区.一个实例的所有用户都共享一个Tempdb.很明显,这样的设计不是很好.当多个应用程序的数据库部署在同一台服务器上的时候,应用程序共享tempdb,如果开发人员不注意对Tempdb的使用就会造成这些数据库相互影响从而影响应用程序. 特性:

谈谈Tempdb对SQL Server性能优化有何影响

先给大家巩固tempdb的基础知识 简介: tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分,用来存储临时对象.可以简单理解tempdb是SQLServer的速写板.应用程序与数据库都可以使用tempdb作为临时的数据存储区.一个实例的所有用户都共享一个Tempdb.很明显,这样的设计不是很好.当多个应用程序的数据库部署在同一台服务器上的时候,应用程序共享tempdb,如果开发人员不注意对Tempdb的使用就会造成这些数据库相互影响从而影响应用程序. 特性:

浅析SQL Server性能优化之索引运算

技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 简介 所谓的索引应用就是在我们日常写的T-SQL语句中,如何利用现有的索引项,再分析的话就是我们所写的查询条件,其实大部分情况也无非以下几种: 1.等于谓词:select ...where...column=@parameter 2.比较谓词:select ...where...column> or < or <> or <= or >= @paramete

SQL Server性能优化综述

近期因工作需要,希望比较全面的总结下SQL Server数据库性能优化相关的注意事项,在网上搜索了 一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERVER6.5以前的版本或者ORACLE是适用的)的信息,只好自己根据以前的经验和测试结果进行总结了. 我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单 单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的.所以我希望按照 软件生命周期的不同