【问题标题】:Subquery v/s inner join in sql serversql server中的子查询与内部联接
【发布时间】:2012-12-12 17:17:27
【问题描述】:

我有以下疑问

第一个使用内连接

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?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      子查询与加入

      表一 20 行,2 列

      表二 20 行,2 列

      子查询 20*20

      加入20*2

      合乎逻辑,纠正

      详细

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

      【讨论】:

      • 嗨;您可以详细说明您所做的测试以及性能差异是什么吗? :~)
      • 图片上传器有问题,给我你的email id,我可以给你发详细信息
      • 在我所有多年的 SQL 中,我从未像在第二个示例中那样在选择行中使用过子查询。不确定这是否与 where 子句中常​​用的子查询具有相同的性能(就像this question is about)。
      【解决方案3】:

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

      Herehere 一些帮助链接。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          加入比子查询快。

          子查询使磁盘访问繁忙,想想访问时来回移动的硬盘读写针(头?):User,SearchExpression,PageSize,DrilldownPageSize,User,SearchExpression,PageSize,DrilldownPageSize,User.. .等等。

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

          来源:Here

          【讨论】:

          • 我认为这取决于执行计划。
          【解决方案6】:

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

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

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

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

          【讨论】:

          • 这总是更好。有时性能可能取决于表中的数据或其他因素。
          • 我发现在 SQL Server Profiler 中使用 CPU、Reads、Writes 和 Duration 列甚至比实际的性能平面更准确。尽管如此,这对于大多数用例来说都是一个不错的选择。
          猜你喜欢
          • 2013-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多