最近在我的同事的代码中,我看到了一个sql查询,在那里她使用了GROUP BY
列的很多列。大多数这些列不需要在查询中分组。她这样做是为了防止这个错误:
列'some_col'在选择列表中无效,因为它是 不包含在聚合函数或GROUP BY子句中。
我想知道GROUP BY
有多重,是否可以使用这些语句?如果它比我更好,我更好地优化她的查询原因现在我处理那段代码。
答案 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
尽管有两个连接到同一个表,会给我性能提升,因为对整数索引进行分组比对文本值,未分类的产品名称进行分组更快。