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

时间:2011-07-04 19:40:51

标签: sql sql-server performance

最近,我被要求编写一个查询来从包含最大数量的此类实体的组中选择实体的属性。所以,我以两种方式在Northwind(MSFT分布式样本)数据库上做到了。

ONE:

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. Open Management Studio
  2. 点击“新查询”按钮
  3. 点击以启用“包含实际查询计划”
  4. 将所有查询发布到活动查询窗口
  5. 点击“执行”按钮
  6. 点击“执行计划”标签(结果左侧)
  7. 查询成本按运行的查询数进行平均。因此,如果比较作为示例提供的两个查询,如果两者都具有50%的成本,则它们是等效的(因为100/2 = 50等)。当存在差异时,除了查看执行路径的图形布局外,还可以将鼠标悬停在SELECT上以查看子树成本。

    为什么一个比另一个快?

    这取决于数据库 - 被连接的数据类型(它们是否尽可能狭窄?“narrow”意味着需要更少的字节来存储),索引以及查询中正在执行的操作。使用不同的语法可以使一切变得不同。

答案 1 :(得分:0)

执行两个激活SET SHOWPLAN_ALL ON的SQL语句。 SQL服务器将为您提供查询信息,这些信息应该有助于您了解正在发生的事情以及哪个更快/更快。