Postgres の SELECT DISTINCT はインデックスがあっても全行をスキャンする
Postgres SELECT DISTINCT Does Not Scale

Postgres の SELECT DISTINCT は、一見するとシンプルで高速に思えるが、実際にはインデックスの有無やユニーク値の数に関係なく、条件に一致するすべての行をスキャンしてしまう。DBOS がパーティション化されたキューでこの問題に直面し、最も単純なクエリが最も高コストになった事例を解説。Postgres の設計上の判断と回避策を紹介する。
SELECT DISTINCT は一見無害な句で、カラムのすべてのユニーク値を取得する。しかしそのパフォーマンス特性は予想外だ。テーブルをどうインデックスしても、取得するユニーク値がどれほど少なくても、SELECT DISTINCT は述語に一致するすべての行を必ずスキャンする。