子查询与sql server中的内连接

时间:2012-12-27 09:48:47

标签: sql performance query-optimization sql-server-2012

我有以下查询

第一个使用内连接

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?

6 个答案:

答案 0 :(得分:29)

通常,连接比内部查询工作得更快,但实际上它将取决于SQL Server生成的执行计划。无论您如何编写查询,SQL Server都将始终根据执行计划对其进行转换。如果它足够“智能”从两个查询生成相同的计划,您将得到相同的结果。

Herehere一些帮助链接。

答案 1 :(得分:11)

在Sql Server Management Studio中,您可以启用“客户端统计”以及包含实际执行计划。这将使您能够准确了解每个请求的执行时间和负载。

同样在每个请求之间清理缓存以避免缓存对性能的影响

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

我认为最好用自己的眼睛看待而不是依靠理论!

答案 2 :(得分:5)

加入比子查询更快。

子查询使繁忙的磁盘访问,想到硬盘的读写指针(head?)在访问时来回传递:User,SearchExpression,PageSize,DrilldownPageSize,User,SearchExpression,PageSize,DrilldownPageSize,User ..等等。

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

来源:Here

答案 3 :(得分:4)

子查询与加入

表1 20行,2列

表2 20行,2列

子查询20 * 20

加入20 * 2

合乎逻辑,纠正

<强>详细

enter image description here

enter image description here

扫描计数表示乘法效应,因为系统必须一次又一次地重复获取数据,为了您的性能指标,只需查看时间

答案 4 :(得分:1)

第一个查询比第二个查询更好..因为第一个查询我们正在加入两个表。 并检查两个查询的解释计划......

答案 5 :(得分:0)

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