J'ai toujours considéré le mot-key ALL
dans le context de la clause GROUP BY
comme vraiment utile et significatif. Je n'ai pas rencontré de problèmes de performances lors de l'utilisation.
La documentation MSDN indique que cela va être EOL (depuis 2005), et recommand de ne pas l'utiliser dans le code de production, mais le prend en charge jusqu'à la dernière version de SQL Server.
Y a-t-il un impact sur les performances ou d'autres raisons pratiques pour ne pas l'utiliser?
Vous pourriez replace
SELECT AggregateFunction(AggColumn) FROM ... WHERE Predicate GROUP BY ALL GrpColumn
avec
SELECT AggregateFunction(CASE WHEN Predicate THEN AggColumn END) FROM ... GROUP BY GrpColumn
Exemple:
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;
Modifier 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
Sortie STOTISTICS 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
Plans d'exécution réels:
Du sharepoint vue des performances, de ce test (j'ai utilisé Adventure Works 2008 R2 ), nous pouvons voir que GROUP BY ALL oblige SQL Server à lire deux fois les mêmes données:
GROUP BY ALL
contre 1 opérateur Scan ou Seek pour GROUP BY + MAX(CASE WHEN)
.