peko’s Hatena Blog

ルールを守ってアクセルシンクロォォォ!!!

DISTINCTを使わないで重複を排除する

SQLのDISTINCTはソート処理でそこそこ負荷があり効率が悪いのでEXISTSとかGROUP BYで代用する方が良いとか何とか…

個人的にはDISTINCTを使うほうが意味が通るので可読性的に好きですけど、昨今データ量の多いシステムが増えているので少しでも不安の種は潰しておきたい所

適当にEXISTSでの代替ソース書くとこんな感じですか

SELECT a.dev_cd, a.dev_name FROM dev_table1.a
WHERE EXISTS ( SELECT dev_sub FROM dev_table2.b WHERE a.dev_cd = b.dev_cd)

正直サブクエリはこれはこれで下手こくと重たくなるので嫌いです。

GROUP BY句はこれはこれで余分なディスクIOが発生したりディスク領域利用したり懸念するところが出てくるとか何とか…

正直次から次に問題の種が沸いて出てめんどくさい。SQLは眉唾も結構あるから一々間に受けていたらきりがない。ある程度のレスポンス周りの知識を生かして記述した後にサイジングとか負荷試験をキチンと行って、その環境のベストエフォートを行うのが一番の近道。

今回はレスポンスとかが問題じゃなくて、分からず屋な製品ちゃんがWHERE以下しかSQLを記述することが出来なくてDISTINCTの代わりを探していたのが本音でした。