So-net無料ブログ作成
検索選択

group byとdistinct [日記]

select COMPANY from USERS group by COMPANY

こんな感じのSQLがありました。

少し考えて理解しました。
テーブル「USERS」中に出てくる COMPANY の値の一覧を取得するための SQL だと。

ちなみに、同じことはコレでも出来ます。

select distinct COMPANY from USERS

というか、こっちが命令の意味的には合っています。

distinct … 同じ内容のレコードを1つにまとめるための命令
group by … 結果を集計するためレコードをグループ化するための命令。

group by で指定したフィールドの値が等しいものは同じグループに入れられてしまうので、結果として、同じ内容のレコードを1つにまとめる効果もあるわけです。

重複データをまとめる専用の命令が distinct で、group by は副作用です。

で、ちょっと調べてみると、distinctgroup by のどちらが良いか比較しているページが沢山見つかりました。
そして、
group by の方が速い」と結論を出している所が非常に多いのにビックリ。

そんなわけないじゃん。

専用命令(distinct)が、副作用の処理(group by)より遅いはずが無いといった単純な理由じゃなくて。

RDBSを作っているメーカ(例えばOracleとか)は、少しでもレスポンスを良くするため改良を続けているのに、より速い実装が目の前にあってノーリスクで利用できるのに、それを使わないなんてありえない。

具体的に言えば、
もし重複データをまとめる処理が distinct より group by の方が速いのだとしたら、内部で group by に置き換えてしまえば group by と同等のレスポンスが得られるというのに、なぜそれをやらないのかと小一時間…

分かりにくい例で例えるのなら…

何でも上手にこなす「ガチ○ピン」と、床掃除しかできない「ム○ク」がいました。

コレしか取り柄がないのだから、床掃除はム○クの方が上手だと思われていたのですが、ある日、床掃除もガチ○ピンの方が上手い事が判明しました。

困ったプロダクションは、
ム○クの中の人をクビにして、ガチ○ピンの中の人に両方の中の人を担当させることにしました。

一方、
もし、ム○クの方が床掃除が上手だとしても、床掃除の時だけガチ○ピンの中の人を入れ替えるかどうかは、入れ替えの手間がどれくらいかかるかで、やったりやらなかったりするわけです。

あなたは、どっちに床掃除を依頼しますか?


そこで、改めて「group by の方が速い」との主張を見てみると……

distinct を使ったSQLと group by を使ったSQL で同じことをさせていない
もしくは、
集計処理っぽいことを distinct を駆使して実現していたりしました。


タグ:SQL
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。