最近,我被要求编写一个查询来从包含最大数量的此类实体的组中选择实体的属性。所以,我以两种方式在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
问题是:哪个更快?在执行计划中,没有什么特别突出的。经过的时间略有不同,但大致相同。当然,数据库很小。
答案 0 :(得分:2)
一个小型数据库很难确定哪个更好,但SQL Server Management Studio具有比较语句效率的功能。
查询成本按运行的查询数进行平均。因此,如果比较作为示例提供的两个查询,如果两者都具有50%的成本,则它们是等效的(因为100/2 = 50等)。当存在差异时,除了查看执行路径的图形布局外,还可以将鼠标悬停在SELECT上以查看子树成本。
这取决于数据库 - 被连接的数据类型(它们是否尽可能狭窄?“narrow”意味着需要更少的字节来存储),索引以及查询中正在执行的操作。使用不同的语法可以使一切变得不同。
答案 1 :(得分:0)
执行两个激活SET SHOWPLAN_ALL ON
的SQL语句。 SQL服务器将为您提供查询信息,这些信息应该有助于您了解正在发生的事情以及哪个更快/更快。