SQL Server中的子查询与内连接

47

我有以下问题

第一个问题是使用内连接

SELECT item_ID,item_Code,item_Name 
FROM [Pharmacy].[tblitemHdr] I 
    INNER JOIN  EMR.tblFavourites F ON I.item_ID=F.itemID
WHERE F.doctorID = @doctorId AND F.favType = 'I'

第二种方法使用子查询,例如:

SELECT item_ID,item_Code,item_Name from [Pharmacy].[tblitemHdr]
WHERE item_ID IN
(SELECT itemID FROM EMR.tblFavourites
WHERE doctorID = @doctorId AND favType = 'I'
)

在这个项目的表格中,[Pharmacy].[tblitemHdr] 包含15列和2000条记录。而[Pharmacy].[tblitemDtl]包含5列和大约100条记录。在这种情况下,哪个查询会给我更好的性能?

5个回答

36

通常情况下,连接查询比内部查询更快,但实际上这取决于SQL Server生成的执行计划。无论您如何编写查询,SQL Server都会将其转换为执行计划。如果它足够“聪明”,能够从两个查询中生成相同的计划,则将获得相同的结果。

这里这里提供了一些帮助链接。


15
在 Sql Server Management Studio 中,您可以启用“客户端统计”和包括实际执行计划。这将使您能够精确了解每个请求的执行时间和负载情况。
此外,在每个请求之间清除缓存以避免缓存对性能的影响。
USE <YOURDATABASENAME>;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO

我认为亲眼看到比依靠理论更好!


这总是更好的。有时性能可能取决于表中的数据或其他因素。 - Ibrahim ULUDAG
我发现在SQL Server Profiler中使用CPU、读取、写入和持续时间列比实际性能平面更准确。尽管如此,对于大多数用例来说,这仍然是一个不错的选择。 - Trisped

8

子查询 VS 连接

表一 20行,2列

表二 20行,2列

子查询 20*20

连接 20*2

逻辑、校正

详细信息

enter image description here

enter image description here

扫描计数表示乘法效应,因为系统需要一遍又一遍地获取数据,对于性能衡量,只需查看时间即可。


在我多年的SQL编程经验中,我从未像你第二个示例中那样在select语句中使用子查询。不确定这是否具有与常用的where子句中的子查询相同的性能(就像这个问题所涉及的那样)。 - MGOwen

6

使用join比子查询更快。

子查询会导致繁忙的磁盘访问,想象一下硬盘的读写针(头?)在访问时来回移动:User、SearchExpression、PageSize、DrilldownPageSize、User、SearchExpression、PageSize、DrilldownPageSize、User...以此类推。

join通过集中操作前两个表的结果来工作,任何后续的连接都将集中在第一个连接表的内存(或缓存到磁盘)结果上,以此类推。较少的读写针移动,因此更快。

来源:这里


1
我认为这取决于执行计划。 - afruzan

2

第一个查询比第二个查询更好。因为第一个查询我们连接了两个表,另外也需要检查两个查询的执行计划。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接