新卒から文系エンジニア→人材業界に転職した人のブログ

新卒から文系エンジニア→人材業界に転職。技術・スキルがないためブログを通して勉強。その後、IT業界の業界知識が活かせる人材業界へ。異業種×異職種の転職経験有り。

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

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

【今回の内容】


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


【SQL入門】基本的なSQLを目的別にまとめてみた - FOR SE




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



今の自分の現場では、重複行を絞り込む時に、「distinct」と「group by」を使う人それぞれいました。



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

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

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


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

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

だが、一般的にgroup byは集合関数(sumとかcountとか)と一緒に使うので、

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


また、どちらが性能が良いかという事に関しては、賛否両論ある様子。


   

■distinct>group by派

   
   なし
   

■group by>distinct派


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

[ThinkIT] 第8回:GROUP BYを使用したチューニング (1/2)


爆裂!C#野郎: DISTINCT と GROUP BY

   

■distinctやgroup byの代りにEXISTSを使う派

基礎から理解するデータベースのしくみ(5) | 日経 xTECH(クロステック)


ORACLE/オラクルSQLリファレンス(チューニング)



個人的には、そもそもDISTINCTやgrop byの代わりにEXISTSを使うという意見がおもしろかった。

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

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



.hatena-module:nth-of-type(10) { background: transparent; } .hatena-module:nth-of-type(10) .hatena-module-title{ display: none; } .hatena-module:nth-of-type(10) .hatena-module-body { padding: 0; }