FOR SE

SEに有益な情報を発信します

このエントリーをはてなブックマークに追加

【SQL入門】group by,distinctどちらが性能がよいのか

【今回の内容】


前回は基本的なSQLを備忘録で簡単にまとめていたけど、


http://forse.hatenablog.com/entry/2014/03/13/200356



その中に気になることがあったので調べたものをメモとして紹介します。



今の自分の現場では、

重複行を絞り込む時に、distinctとgroup by

を使う人それぞれいました。



distinctとgroup byは同じように重複行を消すという意味では

どちらでもいいのかなーと思っていたけど、

疑問に思ったので少し調べてみました。


【疑問】

distinctとgroup by は重複行を消す目的ならどちらを使ってもよいのか?

 

【結論】

結果としてはどちらも重複行を消すという意味では同じらしい。

だが、一般的にgroup byは

集合関数(sumとかcountとか)と一緒に使う

ので、そもそもの目的用途が違うのではという話があった。


また、どちらが性能が良いかという事に関しては


賛否両論ある様子。


   

■distinct>group by

   
   なし
   

■distinct


   distinctではソートの処理があり効率が悪いという主張

   http://thinkit.co.jp/free/marugoto/2/1/18/1.html

   http://csharp.yaminabe.info/2007/03/distinct_group_by.html
   

■どちらでもない派


   http://others2.blog.so-net.ne.jp/2010-09-23

   

■そもそもDISTINCTやgrop byの代りにEXISTSを使う


http://itpro.nikkeibp.co.jp/article/COLUMN/20060111/227105/


 http://oracle.se-free.com/tuning/B1_sql3.html




個人的には、そもそもDISTINCTやgrop byの代わりにEXISTSを使う

という意見がおもしろかった。

手早く目的のデータを取得したいときは、手段は問わない(どれを使ってもいい)けど

性能改善やチューニングを行う際は、こういった知識が必要なのかなと言う意味で。