我有以下查询
第一个使用内连接
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?
答案 0 :(得分:29)
通常,连接比内部查询工作得更快,但实际上它将取决于SQL Server生成的执行计划。无论您如何编写查询,SQL Server都将始终根据执行计划对其进行转换。如果它足够“智能”从两个查询生成相同的计划,您将得到相同的结果。
答案 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
合乎逻辑,纠正
<强>详细强>
扫描计数表示乘法效应,因为系统必须一次又一次地重复获取数据,为了您的性能指标,只需查看时间
答案 4 :(得分:1)
第一个查询比第二个查询更好..因为第一个查询我们正在加入两个表。 并检查两个查询的解释计划......
答案 5 :(得分:0)
这全部取决于表之间的数据和关系映射。 如果不遵循RDBMS规则,那么即使是第一个查询,其执行和数据提取也会很慢。