0

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

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

我想知道GROUP BY有多重,可以使用这样的语句吗?如果它比我最好优化她的查询,因为现在我处理那段代码。

4

1 回答 1

3

如果没有看到特定的查询,很难确定,但我过去常常通过最小化 GROUP BY 中包含的列数,并通过内部查询的连接解决这些列,从而获得了惊人的性能提升(至少在 SQL2K 中)。更具体地说:假设您有分类 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

尽管有两个连接到同一个表,但我会获得性能提升,因为在整数索引上分组比在文本值、未排序的产品名称上分组更快。

于 2012-06-30T11:58:50.570 回答