SQLでGROUP BYが遅いときのチューニング方法

ORACLE SQLでGROUP BYを使って遅い場合のチューニング方法を紹介します。

特に業務アプリケーションで多くの方がやりがちなのが下のようなGROUPBYの使い方です。

例えば、売上データを顧客ごと、担当者ごと、部署ごとに集約して集計する場合です。
本来、集約する項目としては不要な名称までGROUPBYの項目にしています。

確かに集計結果としては同じになります。
しかし、集約する項目が増えれば増えるほど処理は遅くなります。

はじめにこういうSQLを作っていると大体後からメンテする人も同じように項目を追加していきます。
そして次第にデータ件数も増え始め、性能が徐々に落ちていきます。

select
  a.顧客コード
  ,b.顧客名
  ,a.担当者コード
  ,c.担当者名
  ,a.部署コード
  ,d.部署名
  ,SUM(売上金額)
from
  売上 a
  ,顧客マスタ b
  ,担当者マスタ c
  ,部門マスタ d
where
  a.顧客コード = b.顧客コード
  and a.担当者コード = c.担当者コード
  and a.部署コード = d.部署コード
group by
  a.顧客コード
  ,b.顧客名
  ,a.担当者コード
  ,c.担当者名
  ,a.部署コード
  ,d.部署名
;

解決方法は↓のようにSQLの書き換えてください。
無駄な集約項目である名称は省いて一旦、GROUPBYしてください。

集約して、データレコードが少なくなってから名称を取得してください。

select
  x.顧客コード
  ,b.顧客名
  ,x.担当者コード
  ,c.担当者名
  ,x.部署コード
  ,d.部署名
  ,x.売上金額
from
  (a.顧客コード
    ,a.担当者コード
    ,a.部署コード
    ,SUM(売上金額) as 売上金額
  from
    売上 a
  group by
    a.顧客コード
    ,a.担当者コード
    ,a.部署コード
  ) x
  ,顧客マスタ b
  ,担当者マスタ c
  ,部門マスタ d
where
  x.顧客コード = b.顧客コード
  and x.担当者コード = c.担当者コード
  and x.部署コード = d.部署コード
;