sql server中的子查询v/s内部联接
我有以下疑问 第一个是使用内部连接sql server中的子查询v/s内部联接,sql,performance,query-optimization,sql-server-2012,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 [Ph
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条记录。和[药房].[tblitemHdr]
包含5列和大约100条记录。在这种情况下,哪个查询提供了更好的性能?
在Sql Server Management Studio中,您可以启用“客户端统计信息”,还可以包括实际执行计划。这将使您能够准确地知道每个请求的执行时间和负载
此外,在每个请求之间清理缓存,以避免缓存对性能的副作用
USE <YOURDATABASENAME>;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
使用;
去
检查站;
去
DBCC缓冲区;
去
我认为最好是用自己的眼睛看,而不是依靠理论 联接比子查询快 子查询用于繁忙的磁盘访问,想想硬盘的读写针(头?)在访问时来回移动:用户、SearchExpression、PageSize、DrilldownPageSize、用户、SearchExpression、PageSize、DrilldownPageSize、用户。。。等等 join的工作原理是将操作集中在前两个表的结果上,任何后续联接都将集中在第一个联接表的内存(或缓存到磁盘)结果上,依此类推。读写针移动更少,因此速度更快
来源:第一次查询比第二次查询好。。因为第一个查询我们连接了两个表。
还要检查两个查询的解释计划…通常联接比内部查询工作得更快,但实际上它将取决于SQL Server生成的执行计划。无论您如何编写查询,SQL Server都会在执行计划中对其进行转换。如果它足够聪明,可以从两个查询中生成相同的计划,那么您将得到相同的结果 以及一些帮助链接。子查询Vs连接 表1 20行,2列 表2 20行,2列 子查询20*20 加入20*2 合乎逻辑,改正 详细信息
扫描计数表示乘法效应,因为系统必须一次又一次地获取数据。对于性能度量,只需查看时间即可。这一切都取决于数据和表之间的关系映射。
如果不遵循RDBMS规则,那么即使是第一个查询,执行和数据获取也会很慢。这总是更好的。有时性能可能取决于表中的数据或其他因素。我发现在SQL Server Profiler中使用CPU、读、写和持续时间列甚至比实际的性能平面更准确。不过,对于大多数用例来说,这是一个很好的选择;您能详细介绍一下您所做的测试以及性能差异吗?:~)图像上传器有点问题,给我发电子邮件id,我可以给你发送详细信息在我多年的SQL中,我从来没有像你的第二个例子那样在选择行中使用过子查询。不确定这是否与where子句中常用的子查询具有相同的性能(就像这个问题所涉及的),我认为这取决于执行计划。