我一直认为子句ALL
上下文中的关键字GROUP BY
非常有用且有意义。使用它时,我没有遇到任何性能问题。
MSDN文档指出它将为EOL(自2005年起),建议不要在生产代码中使用它,但在SQL Server最新版本之前仍将支持它。
不使用会产生性能影响或其他实际原因吗?
您可以更换
SELECT AggregateFunction(AggColumn)
FROM ...
WHERE Predicate GROUP BY ALL GrpColumn
与
SELECT AggregateFunction(CASE WHEN Predicate THEN AggColumn END)
FROM ...
GROUP BY GrpColumn
例:
SELECT p.ProductID, MAX(p.UnitPrice) AS MAX_UnitPrice
FROM (
SELECT 1, 100 UNION ALL
SELECT 1, 10.5 UNION ALL
SELECT 1, 10 UNION ALL
SELECT 2, 55 UNION ALL
SELECT 2, 99
) p(ProductID, UnitPrice)
WHERE p.ProductID = 1
GROUP BY ALL p.ProductID;
SELECT p.ProductID,
MAX(CASE WHEN p.ProductID = 1 THEN p.UnitPrice END) AS MAX_UnitPrice
FROM (
SELECT 1, 100 UNION ALL
SELECT 1, 10.5 UNION ALL
SELECT 1, 10 UNION ALL
SELECT 2, 55 UNION ALL
SELECT 2, 99
) p(ProductID, UnitPrice)
GROUP BY ALL p.ProductID;
编辑1:
SET NOCOUNT ON;
SET STATISTICS IO ON;
PRINT 'Test #1: GROUP BY ALL'
SELECT p.ProductModelID,
MAX(p.ListPrice) AS MAX_ListPrice
FROM Production.Product p
WHERE p.Color = 'Red'
GROUP BY ALL p.ProductModelID
PRINT 'Test #2: GROUP BY + MAX(CASE WHEN)'
SELECT p.ProductModelID,
MAX(CASE WHEN p.Color = 'Red' THEN p.ListPrice END) AS MAX_ListPrice
FROM Production.Product p
GROUP BY p.ProductModelID
统计IO输出:
Test #1: GROUP BY ALL
Table 'Product'. Scan count 2, logical reads 30
Test #2: GROUP BY + MAX(CASE WHEN)
Table 'Product'. Scan count 1, logical reads 15
实际执行计划:
从性能的角度来看,从该测试(我使用Adventure Works 2008 R2)中,我们可以看到GROUP BY ALL强制SQL Server两次读取相同的数据:
GROUP BY ALL
与1个操作员“扫描或寻找” GROUP BY + MAX(CASE WHEN)
。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句