Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server中的子查询v/s内部联接_Sql_Performance_Query Optimization_Sql Server 2012 - Fatal编程技术网

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子句中常用的子查询具有相同的性能(就像这个问题所涉及的),我认为这取决于执行计划。