SQLServer Execpt和not in 性能区别

 更新时间:2012年01月20日 22:42:57   作者:  
网上有很多 except 和 not in的返回结果区别这里就就提了
主要讲 except 和 not in 的性能上的区别。
复制代码 代码如下:

CREATE TABLE tb1(ID int)
CREATE TABLE tb2(ID int)
BEGIN TRAN
DECLARE @i INT = 500
WHILE @i > 0
begin
INSERT INTO dbo.tb1
VALUES ( @i -- v - int
)
SET @i = @i -1
end
COMMIT我测试的时候tb1 是1000,tb2 是500

复制代码 代码如下:

DBCC FREESYSTEMCACHE ('ALL','default');
SET STATISTICS IO ON
SET STATISTICS TIME on
SELECT * FROM tb1 EXCEPT SELECT * FROM tb2;
SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2);--得不到任何值
SET STATISTICS IO OFF
SET STATISTICS TIME OFF

执行计划:
复制代码 代码如下:

SELECT * FROM tb1 EXCEPT SELECT * FROM tb2;
|--Merge Join(Right Anti Semi Join, MERGE:([master1].[dbo].[tb2].[ID])=([master1].[dbo].[tb1].[ID]), RESIDUAL:([master1].[dbo].[tb1].[ID] = [master1].[dbo].[tb2].[ID]))
|--Sort(DISTINCT ORDER BY:([master1].[dbo].[tb2].[ID] ASC))
| |--Table Scan(OBJECT:([master1].[dbo].[tb2]))
|--Sort(DISTINCT ORDER BY:([master1].[dbo].[tb1].[ID] ASC))
|--Table Scan(OBJECT:([master1].[dbo].[tb1]))

复制代码 代码如下:

SELECT * FROM tb1 WHERE id NOT IN(SELECT id FROM tb2);--得不到任何值
|--Hash Match(Right Anti Semi Join, HASH:([master1].[dbo].[tb2].[ID])=([master1].[dbo].[tb1].[ID]), RESIDUAL:([master1].[dbo].[tb1].[ID]=[master1].[dbo].[tb2].[ID]))
|--Table Scan(OBJECT:([master1].[dbo].[tb2]))
|--Nested Loops(Left Anti Semi Join)
|--Nested Loops(Left Anti Semi Join, WHERE:([master1].[dbo].[tb1].[ID] IS NULL))
| |--Table Scan(OBJECT:([master1].[dbo].[tb1]))
| |--Top(TOP EXPRESSION:((1)))
| |--Table Scan(OBJECT:([master1].[dbo].[tb2]))
|--Row Count Spool
|--Table Scan(OBJECT:([master1].[dbo].[tb2]), WHERE:([master1].[dbo].[tb2].[ID] IS NULL))

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
(500 行受影响)
表 'tb1'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'tb2'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(6 行受影响)
(1 行受影响)
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 528 毫秒。
(500 行受影响)
表 'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'tb2'。扫描计数 3,逻辑读取 1002 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'tb1'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
(10 行受影响)
(1 行受影响)
SQL Server 执行时间:
CPU 时间 = 16 毫秒,占用时间 = 498 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

结论:通过较多数据 和 较少数据的测试,在较少数据的情况下 not in 比 except 性能好,但是在较多数据情况下 execpt 比 not in 出色。
看执行计划可以得知 如何 在 tb1 和tb2 上建立索引,那么except 的执行计划开可以得到优化。

如果大家有兴趣可以看看 not exists 的执行计划。建议:
大家不要迷信测试结果,因为所有的性能都是和执行计划密切相关的。而执行计划和统计数据又密不可分。
所以过度的迷信测试结果,可能会对生产库造成性能的影响达不到预期的性能效果。

相关文章

  • SQL  BETWEEN 的常见用法小结

    SQL  BETWEEN 的常见用法小结

    BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQL  BETWEEN 的常见用法,感兴趣的朋友一起看看吧
    2025-04-04
  • SQLServer 中.与::的区别

    SQLServer 中.与::的区别

    SQL Server中调用方法时,经常遇到.或是::两种调用方法,其中. 是实例调用方法,::是静态调用方法。如果大家对C#语法熟悉的话,. 对应C#中调用实例方法,:: 对应C#中的static方法。
    2009-07-07
  • SQL Server如何建表的详细图文教程

    SQL Server如何建表的详细图文教程

    创建表之前一定要先了解数据类型与约束,这样我们才能创建正确的表,下面这篇文章主要给大家介绍了关于SQL Server如何建表的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • SQL Server中的T-SQL的基本对象

    SQL Server中的T-SQL的基本对象

    SQL的基本对象主要有常量,表示符,分隔符,保留关键字。
    2010-05-05
  • sqlserver 字段值拼接的实现示例

    sqlserver 字段值拼接的实现示例

    拼接字段可以通过多种方法实现,本文主要介绍了sqlserver字段值拼接的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同

    SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同

    这篇文章主要介绍了SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同的相关资料,需要的朋友可以参考下
    2016-02-02
  • sql 取代游标的写法示例

    sql 取代游标的写法示例

    本节主要介绍了sql取代游标该如何写,需要的朋友可以参考下
    2014-07-07
  • SQL 特殊语句(学习笔记)

    SQL 特殊语句(学习笔记)

    SQL 特殊语句(学习笔记),以XML 返回,处理大批量数据的添加,转换类型等实现
    2012-05-05
  • 详解将DataGrip连接到MS SQL Server的方法

    详解将DataGrip连接到MS SQL Server的方法

    这篇文章主要介绍了详解将DataGrip连接到MS SQL Server的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Sql Server 2016新功能之Row-Level Security(值得关注)

    Sql Server 2016新功能之Row-Level Security(值得关注)

    Sql Server 2016 有一个新功能叫 Row-Level Security 。下面通过实例给大家介绍Sql Server 2016新功能之Row-Level Security,感兴趣的朋友一起看看吧
    2016-11-11

最新评论