哪个 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 查询更快,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快