繁体   English   中英

SQL Server中的子查询v / s内部联接

[英]Subquery v/s inner join in sql server

我有以下查询

第一个使用内部联接

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].[tblitemHdr]包含5栏和大约100条记录。 在这种情况下which query gives me better performance?

通常,联接将比内部查询更快地运行,但实际上,它将取决于SQL Server生成的执行计划。 无论您如何编写查询,SQL Server都将始终根据执行计划对其进行转换。 如果它足够“聪明”,可以从两个查询中生成相同的计划,那么您将获得相同的结果。

这里这里一些帮助的链接。

在Sql Server Management Studio中,您可以启用“ 客户端统计信息 ”,还可以包括实际执行计划 这使您能够准确知道每个请求的执行时间和负载。

还在每个请求之间清理缓存,以避免缓存对性能的副作用

USE <YOURDATABASENAME>;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO

我认为用肉眼看总是比依靠理论更好!

连接比子查询快。

子查询导致磁盘访问繁忙,请考虑访问硬盘时来回读写的针(头?):User,SearchExpression,PageSize,DrilldownPageSize,User,SearchExpression,PageSize,DrilldownPageSize,User ...等上。

联接通过将操作集中在前两个表的结果上而起作用,任何后续联接将把联接集中在第一个联接表的内存中(或缓存到磁盘)结果上,依此类推。 更少的读写针移动,从而更快

资料来源: 这里

子查询与连接

表一20行,2列

表两20行,2列

子查询20 * 20

参加20 * 2

合理地纠正

详细

在此处输入图片说明

在此处输入图片说明

扫描计数表示倍增效果,因为系统必须一次又一次地读取数据,对于性能指标而言,只需查看时间即可

第一个查询比第二个查询要好..因为第一个查询我们将两个表都加入了。 并检查两个查询的解释计划...

这完全取决于表之间的数据和关系映射。 如果不遵循RDBMS规则,那么即使第一个查询在执行和数据获取上也将很慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM