0

最近、同僚のコードで、彼女GROUP BYが多くの列で使用する SQL クエリを見ました。これらの列のほとんどは、クエリでグループ化する必要はありません。このエラーを防ぐために、彼女は次のようにしました。

列 '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

整数インデックスでのグループ化は、テキスト値の並べ替えられていない製品名でのグループ化よりも高速であるため、同じテーブルへの 2 つの結合にもかかわらず、パフォーマンスが向上します。

于 2012-06-30T11:58:50.570 に答える