站长网 MsSql教程 SQLServer Execpt和not in 性能差异

SQLServer Execpt和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我测试的

主要讲 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 毫秒。

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/jc/mssql/2021/1224/42800.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部