kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

DISTINCTはコストが高い

SQLのDISTINCTはコストが高いらしい。

itpro.nikkeibp.co.jp

仕事場でいろいろと教えてもらいながらやっている中で、DISTINCTは最終手段だよ。と教えてもらった。

DISTINCTはJOINの書き方で対処ができるはず。らしい。

そういうものかといま意識してどうすればいいか考えているところです。

DISTINCTの代りにEXISTSを使う

SELECT文にDISTINCT*Aを指定すると処理に非常に時間がかかります。DISTINCTを使用するのは極力避けましょう。DISTINCTと同等の結果を得ることのできるSQL文にEXISTSがあります。例えば,

SELECT DISTINCT a.ID1, a.NAME1 FROM
TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2

のSQL文は,副問い合わせの条件としてEXISTSを指定して

SELECT a.ID1, a.NAME1 FROM TABLE1 a
WHERE EXISTS ( SELECT 'X' FROM 
TABLE2 b WHERE a.ID1 = b.ID2)

と書き換えることができます。同様に,NOT INからNOT EXISTSに代替することによってパフォーマンスが向上することもあるので,これも検討してみてください。

かなり納得。

INよりEXISTSでかなり早くなったことはあった。

DISTINCTをやめたSQLでやってみよう。