哪个 SQL 查询更快,为啥?

Posted

技术标签:

【中文标题】哪个 SQL 查询更快,为啥?【英文标题】:Which SQL query is faster and why?哪个 SQL 查询更快,为什么? 【发布时间】:2011-07-04 19:40:50 【问题描述】:

最近,有人要求我编写一个查询,以便从包含最大数量的此类实体的组中选择实体的属性。因此,我在 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

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

【问题讨论】:

也许你可以显示执行计划? 如果数据库很小,那么这个问题就没有意义了。 我没有庞大的数据库来验证;因此问题。如果我能看到显着的差异,我为什么要问它? :-) 我认为 SQL 专家可以立即指出一些陷阱。 【参考方案1】:

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

    打开管理工作室 点击“新建查询”按钮 点击启用“包括实际查询计划” 将所有查询发布到活动查询窗口中 点击“执行”按钮 点击“执行计划”标签(结果左侧)

查询成本由运行的查询次数平均得出。因此,如果比较作为示例提供的两个查询,如果两者的成本均为 50%,那么它们是等价的(因为 100 / 2 = 50 等)。当存在差异时,您可以将鼠标悬停在 SELECT 上以查看子树成本,此外还可以查看执行路径的图形布局。

为什么一个比另一个快?

这取决于数据库——连接的数据类型(它们是否尽可能窄?“窄”意味着存储的字节数更少)、索引以及查询中执行的操作。使用不同的语法可以产生很大的不同。

【讨论】:

【参考方案2】:

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

【讨论】:

谢谢你。我相信这和上面的答案是一样的。

以上是关于哪个 SQL 查询更快,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

这两个sql查询语句哪个更快?

为啥我的 Sql 查询第二次运行更快?

为啥执行存储过程比脚本中的 SQL 查询更快?

为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快

Oracle中,为啥同样的SELECT查询语句,加了CREATE TABLE AS后速度更快了?

哪个查询更可取以及为啥