admin

哪个SQL查询更快,为什么?

sql

最近,有人要求我编写查询以从包含此类实体最大数量的组中选择实体的属性。因此,我以几种方式在Northwind(MSFT分布式示例)数据库上进行了此操作。

一:

SELECT cat.CategoryName, prod.ProductName 
  FROM Categories cat 
  JOIN Products prod ON cat.CategoryID = prod.CategoryID
  JOIN (SELECT TOP 1 p.CategoryID, COUNT(p.ProductId) as products
          FROM Categories c 
          JOIN Products p on c.CategoryID = p.CategoryID
      GROUP BY p.CategoryID
      ORDER BY products desc) c ON c.CategoryID = cat.CategoryID

二:

SELECT cat.CategoryName, prod.ProductName
  FROM Categories cat
  JOIN Products prod ON cat.CategoryID = prod.CategoryID
  JOIN (SELECT CategoryID, COUNT(ProductID) m_count
          FROM Products 
      GROUP BY CategoryID
        HAVING COUNT(ProductID) = (SELECT MAX(sub.cnt) 
                                     FROM (SELECT CategoryId, COUNT(ProductID) cnt 
                                             FROM Products 
                                         GROUP BY CategoryId) sub)) m ON m.CategoryID = cat.CategoryID

问题是: 为什么更快 ?在执行计划中,没有什么特别突出。经过的时间略有不同,但大致相同。数据库当然很小。


阅读 206

收藏
2021-07-01

共1个答案

admin

一个很小的数据库很难确定哪个更好,但是SQL Server Management Studio具有将语句的效率相互比较的功能。

  1. 开放式管理工作室
  2. 点击“新查询”按钮
  3. 单击以启用“包括实际查询计划”
  4. 将所有查询发布到活动查询窗口中
  5. 点击“执行”按钮
  6. 出现时,点击“执行计划”标签(结果左侧)

查询成本是由运行查询的数量平均得出的。因此,如果比较作为示例提供的两个查询,如果两个查询的成本均为50%,则它们是等效的(因为100/2 =
50,依此类推)。如果存在差异,除了查看执行路径的图形布局之外,还可以将鼠标悬停在SELECT上以查看子树成本。

为什么一个比另一个快?

这取决于数据库-联接的数据类型(它们是否尽可能窄?“ narrow”意味着需要较少的字节来存储),索引以及查询中要执行的操作。使用不同的语法可能会有所不同。

2021-07-01