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

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

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

>>SQLが突然遅くなる原因と対応方法

>>ORACLEチューニング関連記事の一覧

例えば、売上データを顧客ごと、担当者ごと、部署ごとに集約して集計する場合です。
本来、集約する項目としては不要な名称まで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.部署コード
;



>>おすすめのORACLE参考書まとめ





【SQLでお困りの方にオススメ】
■SQLが遅くなる原因
・SQLが突然遅くなる原因と対応方法
・OracleSQLのレスポンスが遅い原因3つ
・JOINを使って表結合するとSQLが遅い!?
・SQLがパラレル実行されない原因

■SQLチューニングの基礎知識
・ORACLE SQLのヒントとは
・ORACLEのオプティマイザと実行計画について
・ORACLEのテーブルやインデックスの「統計情報」とは

■SQLチューニングの方法
・SELECT文のSQLチューニング方法
・OracleExadataでのSQLチューニング方法
・SLECT文が遅いときのインデックス作成によるチューニング方法
・INSERT文のSQLチューニング方法
・Update文が遅いときのチューニング方法
・Delete文が遅いときのチューニング方法
・IN句をEXISTS句に置き換えするチューニング方法
・OR句の置き換えによるチューニング方法
・IN句の置き換えによるチューニング方法
・テーブルアクセスフルスキャンを無くしてチューニングする方法
・SQLでGROUP BYが遅いときのチューニング方法
・SQLのソート処理が遅い場合のチューニング方法

■表や索引の断片化対策
・プロが教えるORACLEの表や索引の断片化解消の見積り方法
・ORACLE表の断片化を解消する3つの方法

■SQLのチューニングの補足情報
・ORACLE SQLヒントの書き方
・SQLに複数のヒントの書き方
・OracleSQLに実装すべき3つのSQLヒント
・ORACLE表の統計情報取得日の確認方法
・「統計情報が古い」とはどういうことか
・ORACLE表の統計情報の取得方法

【自己学習したい方にオススメ】
・自宅で勉強用にORACLEデータベースを無償でダウンロードし構築する方法
・OracleMasterGold12cに一ヵ月で合格した勉強方法
・OracleMasterExpertパフォーマンス&チューニングに一ヵ月で合格した勉強方法
・手に職がない人はIT業界へ、オススメ資格と勉強方法
・OracleDBのチューニング勉強方法
・OraclePL/SQL勉強方法