分组中的操作计数

时间:2012-06-30 11:49:18

标签: sql-server group-by

最近在我的同事的代码中,我看到了一个sql查询,在那里她使用了GROUP BY列的很多列。大多数这些列不需要在查询中分组。她这样做是为了防止这个错误:

  

列'some_col'在选择列表中无效,因为它是   不包含在聚合函数或GROUP BY子句中。

我想知道GROUP BY有多重,是否可以使用这些语句?如果它比我更好,我更好地优化她的查询原因现在我处理那段代码。

1 个答案:

答案 0 :(得分:3)

在没有看到特定查询的情况下很难确定,但我曾经通过最小化GROUP BY中包含的列数来实现令人惊讶的性能提升(在SQL2K中为leas),并通过内部连接解析这些列查询。更具体一点:假设您已对OrderDetails(OrderID,ProductID,Quantity,Price)和Products(ProductID,ProductName)表进行分类。更改此查询:

select P.ProductID, ProductName, sum(Quantity * Price)
from Products as P
  inner join OrderDetails as OD on P.ProductID = OD.ProductID
group by P.ProductID, ProductName

到此:

select X.ProductID, PP.ProductName, X.OrderValue
from
  (
    select P.ProductID, sum(Quantity * Price) as OrderValue
    from Products as P
       inner join OrderDetails as OD on P.ProductID = OD.ProductID
    group by P.ProductID
  ) as X
    inner join Products as PP on X.ProductID = P.ProductID
尽管有两个连接到同一个表,

会给我性能提升,因为对整数索引进行分组比对文本值,未分类的产品名称进行分组更快。