再论一下in,exists,join

本文通过测试对比了在SQL中使用EXISTS、IN和INNER JOIN进行关联查询的性能差异,实验基于微软Adventureworks数据库进行,结果显示优化器能有效优化查询计划,不同谓词的实际效果在现代SQL Server版本中差异不大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL优化--使用 EXISTS 代替 IN 和 关联查询(inner join) 昨天的这篇文章提及到的一些问题,在这里我做一下自己的测试,测试结果以微软标准Adventureworks数据库内数据结构为准。

 

测试语句:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
set statistics io on
set statistics time on
select a.* from Production.Product a inner join Production.ProductModel b
on (a.ProductModelID = b.ProductModelID)

select a.* from Production.Product a where exists (select 'X' from Production.ProductModel b
where a.ProductModelID = b.ProductModelID)

select a.* from Production.Product a where a.ProductModelID in (select b.ProductModelID from Production.ProductModel b)

 

测试统计:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
SQL Server 分析和编译时间: 
   CPU 时间 
= 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
   CPU 时间 
= 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 
= 15 毫秒,占用时间 = 63 毫秒。

SQL Server 执行时间:
   CPU 时间 
= 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
   CPU 时间 
= 0 毫秒,占用时间 = 1 毫秒。

(
9440 行受影响)
表 
'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'Product'。扫描计数 1,逻辑读取 474 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'ProductModel'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(
1 行受影响)

SQL Server 执行时间:
   CPU 时间 
= 63 毫秒,占用时间 = 1984 毫秒。

(
9440 行受影响)
表 
'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'Product'。扫描计数 1,逻辑读取 474 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'ProductModel'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(
1 行受影响)

SQL Server 执行时间:
   CPU 时间 
= 78 毫秒,占用时间 = 1780 毫秒。

(
9440 行受影响)
表 
'Worktable'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'Product'。扫描计数 1,逻辑读取 474 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 
'ProductModel'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(
1 行受影响)

SQL Server 执行时间:
   CPU 时间 
= 109 毫秒,占用时间 = 1366 毫秒。
SQL Server 分析和编译时间: 
   CPU 时间 
= 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
   CPU 时间 
= 0 毫秒,占用时间 = 1 毫秒。

 

执行计划

 

可以看到无论是查询计划还是统计IO,都是一样的。

这都是优化器的功劳,并不存在哪个谓词就好些,除非你的测试环境是2000以下。

 

转载于:https://www.cnblogs.com/perfectdesign/archive/2008/08/06/sql_exists_in.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值