SQL Server 性能优化之——T-SQL NOT IN 和 NOT Exists
这次介绍一下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。
例子:
首先创建两个表
use [MyTest]
create table Test1 ([id] int, [name] varchar(20))
create table Test2 ([id] int, [name] varchar(20), [address] varchar(100))
declare @RowC int
declare @Name varchar(20)
set @RowC = 0
while @RowC < 400000
Begin
set @Name = 'TestName' + CAST(@RowC as varchar(10))
insert into Test1(id, name) values(@RowC, @Name)
set @RowC = @RowC+1
end
declare @RowC int
declare @Name varchar(20)
declare @Address varchar(100)
set @RowC = 0
while @RowC < 500000
Begin
set @Name = 'TestName' + CAST(@RowC as varchar(10))
set @Address = 'TestAddress' + CAST(@RowC as varchar(10))
insert into Test2([id], [name], [address]) values(@RowC, @Name, @Address)
set @RowC = @RowC+1
end
使用Not IN命令Select/update/delete操作:
SELECT [name] FROM Test2 where [name] not in (select [name] from Test1)
UPDATE Test2 SET [name] =N'New_Name' where [name] not in (select [name] from Test1)
DELETE Test2 FROM Test2 where [name] not in (select [name] from Test1)
使用性能更好语法更简洁的Merge and Except:
merge Test2 T using (select name from Test2 except select name from Test1 )S on t.name=s.name
when matched then update SET name=N'New_Name' ;
merge Test2 T using (select name from Test2 except select name from Test1 )S on t.name=s.name
when matched then delete ;
SELECT * FROM Test2 S where not exists (select 1 from Test2 inner join Test1 on Test2.name=Test1.name and Test2.name=s.name)
注意,上面还是有一部分使用了Not Exists:
SELECT name FROM Test2 S where not exists (select 1 from Test2 inner join Test1 on Test2.name=Test1.name and Test2.name=s.name)
现在需要使用简洁的Except:
select name from Test1 except select name from Test2
在这里只是给出了例子,没有拿出实际的对比数据。但是Merge 和Except 两个命令在大数据的处理方面的性能,要比
Not IN 好很多,代码简洁程度上,要比和Not EXISTS好很多。不管你信不信,反正我信了!!!
上测试数据喽:Test1中有400000条数据,Test2中有500000条数据其中100000条数据的name是不同
Select Not IN:18秒
Select Except:几乎没有花费时间
Update Not IN: 19秒
Update Except、Merge:
删除操作和上面两个操作时间基本一样,在这里就不上图片了。
Not Exists性能上面并没有比except好多少。在我的测试数据上,两个几乎是在1秒以内完成操作的!!!
在次谢谢@徐少侠的评价及意见,希望大家看一下。
SQL Server 性能优化之——T-SQL NOT IN 和 NOT Exists的更多相关文章
- 【SQL Server性能优化】运用SQL Server的全文检索来提高模糊匹配的效率
原文:[SQL Server性能优化]运用SQL Server的全文检索来提高模糊匹配的效率 今天去面试,这个公司的业务需要模糊查询数据,之前他们通过mongodb来存储数据,但他们说会有丢数据的问题 ...
- SQL Server 性能优化(一)——简介
原文:SQL Server 性能优化(一)--简介 一.性能优化的理由: 听起来有点多余,但是还是详细说一下: 1.节省成本:这里的成本不一定是钱,但是基本上可以变相认为是节省钱.性能上去了,本来要投 ...
- SQL Server 性能优化之——系统化方法提高性能
SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...
- SQL Server性能优化与管理的艺术 附件下载地址
首先感谢读者们对鄙人的支持,购买了<SQL Server性能优化与管理的艺术>,由于之前出版社的一些疏忽,附件没有上传成功,再次本人深表歉意. 请需要下载附件的读者从下面链接下载,谢谢: ...
- SQL Server性能优化(6)查询语句建议
1. 如果对数据不是工业级的访问(允许脏读),在select里添加 with(nolock) ID FROM Measure_heat WITH (nolock) 2. 限制结果集的数据量,如使用TO ...
- SQL SERVER性能优化综述
SQL SERVER性能优化综述 一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的.所以我希望按照软 ...
- SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1)
SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1) 安装Quick Start工具 RML(Replay Markup Language)是MS ...
- 【SQL Server性能优化】删除大量数据的方法比较
原文:[SQL Server性能优化]删除大量数据的方法比较 如果你要删除表中的大量数据,这个大量一般是指删除大于10%的记录,那么如何删除,效率才会比较高呢? 而如何删除才会对系统的影响相对较小呢? ...
- SQL Server 性能优化之——重复索引
原文 http://www.cnblogs.com/BoyceYang/archive/2013/06/16/3139006.html 阅读导航 1. 概述 2. 什么是重复索引 3. 查找重复索引 ...
- SQL Server 性能优化详解
故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...
随机推荐
- EmptyRecycle() 清空回收站
//在uses下面引用 function SHEmptyRecycleBinA(Wnd:HWND;str:PChar;WRD:DWORD):Integer;stdcall; external 'SHe ...
- 初尝 JFinal 项目(一)
temp1: JFinal项目与JAVA项目类似,有属性方法.操作方法.Sql语句操作.jdbc.配置文件 对比:|| JAVA: Bean / Srv(Server) / SqlMap / jdbc ...
- vsnprintf
http://www.cplusplus.com/reference/cstdio/vsnprintf/ int vsnprintf (char * s, size_t n, const char * ...
- 重新认识Android
首先我们来看下源码中源于Activity的定义: public class Activity extends ContextThemeWrapper implements LayoutInflater ...
- mac安装Mysql官方示例数据库employee
1. 下载地址 https://launchpad.net/test-db/employees-db-1/1.0.6 2. 执行命令 /usr/local/mysql/bin/mysql -t -u ...
- bind的用处
刚做的项目,遇到过这样的问题,就是在动态追加标签时,给追加的标签添加事件时,在标签内追加不了,后来使用了delegate代理,能响应了,但也是不能给动态追加的代理 $("body" ...
- Looping Techniques
[Looping Techniques] 1.When looping through dictionaries, the key and corresponding value can be ret ...
- 在Linux终端命令行下播放音乐的命令(Ubuntu)
现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...
- [转][MSSQL]SQL Server 2008 记住密码功能
本文转自:http://zhidao.baidu.com/link?url=V_laNOvutMin0kU3DUaMhLSFAYfgtz2IoEAjh8grNVPOZLpd8Pudb4iqZl88Tn ...
- 如何在Ubuntu上更新Node.js
自己系统上一直用的1.0版本的,想要更新直接apt肯定不行的.于是找了一种比较方便的安装方式. 如果想安装最新的 6.x 版本 只需要 #Using Ubuntu curl -sL https://d ...