45

我有以下查询

第一个使用内连接

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?

4

6 回答 6

37

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

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

于 2012-12-27T10:03:06.740 回答
14

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

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

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

我认为亲眼所见总比依靠理论好!

于 2012-12-27T09:55:16.030 回答
7

子查询与联接

表一 20 行,2 列

表二 20 行 2 列

子查询20*20

加入20*2

合乎逻辑,纠正

详细的

在此处输入图像描述

在此处输入图像描述

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

于 2016-04-23T08:27:42.663 回答
6

join 比子查询快。

子查询使磁盘访问繁忙,想想硬盘的读写针(头?)在访问时来回走动:用户,搜索表达式,页面大小,DrilldownPageSize,用户,搜索表达式,页面大小,DrilldownPageSize,用户......等等在。

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

来源:这里

于 2012-12-27T09:56:32.673 回答
2

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

于 2012-12-27T09:56:54.640 回答
0

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

于 2019-08-27T12:16:39.933 回答