Contre pour l'utilisation de GROUP BY ALL?

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: entrez la description de l'image ici

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:

  • Le plan d'exécution a deux opérateurs d'indexing,
  • La sortie de STATISTICS IO ON montre également 2 scans et le num. des lectures logiques (dans mon test) pour GROUP BY ALL est plus grand que le num. de lectures logiques pour une solution non GROUP BY ALL. De plus, la création d'index ne changera pas cette situation: 2 opérateurs Scanner et / ou searchr pour GROUP BY ALL contre 1 opérateur Scan ou Seek pour GROUP BY + MAX(CASE WHEN) .