最近,有人要求我编写查询以从包含此类实体最大数量的组中选择实体的属性。因此,我以几种方式在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 Server Management Studio具有将语句的效率相互比较的功能。
查询成本是由运行查询的数量平均得出的。因此,如果比较作为示例提供的两个查询,如果两个查询的成本均为50%,则它们是等效的(因为100/2 = 50,依此类推)。如果存在差异,除了查看执行路径的图形布局之外,还可以将鼠标悬停在SELECT上以查看子树成本。
这取决于数据库-联接的数据类型(它们是否尽可能窄?“ narrow”意味着需要较少的字节来存储),索引以及查询中要执行的操作。使用不同的语法可能会有所不同。