IT Soldier Sakuri !!

Oracle使い。いつのまにかIT戦士になってしまったさくりの可哀想な奮闘記。

Oracle活用 重複排除はGROUP BYではなくてDISTINCTを使うべし!

今日はぶちょーと2人で出張に行く日だったんだけど、
私の切実なお祈りの所為か(笑)、本日ぶちょーは病欠となって、
隣の課の課長と出張になりました♪♪
非常にリラックスした出張となり、Oracleのバージョンアップをしてきたんですが、
なんの問題もなくスルリと作業が終了して、帰りに宇都宮駅で餃子食べて帰ってきました!!
f:id:itsoldiersakuri:20150806220545j:plain


さて、本題。

OracleSQLで重複排除にGROUP BYを使う人がいる。
もちろんこれは間違いじゃない。
でも絶対DISTINCTの方がいい。

数百件くらいのデータ件数なら特に問題はないかもしれないけれど、
データ量が数万、数十万、数百万となった時には処理速度が全然変わってくる。

例えば・・・
「従業員が所属している部署と部署名を出力する。」とき。


まずはGROUP BYを使用。

21:56:25 SQL> select a.department_id, b.department_name
21:56:30   2  from employees a, departments b
21:56:36   3  where a.department_id = b.department_id
21:56:37   4  group by a.department_id, b.department_name
21:56:41   5  order by 1
21:56:43   6  /

DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------------------------------------------------
           10 Administration
           20 Marketing
           30 Purchasing
           40 Human Resources
           50 Shipping
           60 IT
           70 Public Relations
           80 Sales
           90 Executive
          100 Finance
          110 Accounting

11行が選択されました。

21:56:44 SQL>


続いてDISTINCTを使用。

21:54:18 SQL> select distinct a.department_id, b.department_name
21:54:33   2  from employees a, departments b
21:54:35   3  where a.department_id = b.department_id
21:54:38   4  order by 1
21:54:45   5  /

DEPARTMENT_ID DEPARTMENT_NAME
------------- ------------------------------------------------------------
           10 Administration
           20 Marketing
           30 Purchasing
           40 Human Resources
           50 Shipping
           60 IT
           70 Public Relations
           80 Sales
           90 Executive
          100 Finance
          110 Accounting

11行が選択されました。

結果はもちろん同じ。
今回はデータ数が少ないので、どちらも1秒で返ってきている。

従業員マスタ(EMPLOYEES)と部署マスタ(DEPARTMENTS)を結合するところは同じ。
最後にグルーピングして表示させるのが、GROUP BY
最後に重複した行を削除して表示させるのが、DISTINCT
やっぱり労力はDISTINCTの方が断然少ない。

いつもそんなにたくさんのデータを扱うわけではないかもしれないけれど、
いつも実行するSQLのパフォーマンスは気にしておきたいところ。

これを…ちゃんと実行計画や統計情報を取って確認したい…。
明日それを調べるぞー!!!