PostgreSQLで以下のようなusersテーブルがあるとします。
| id | name | |
|---|---|---|
| 1 | テスト太郎1 | test1@test.com |
| 2 | テスト太郎2 | test2@test.com |
| 3 | テスト太郎3 | test1@test.com |
| 4 | テスト太郎4 | test1@test.com |
| 5 | テスト太郎5 | test2@test.com |
| 6 | テスト太郎6 | test1@test.com |
emailは重複するので、ユニークなemail数を調べたいです。
シンプルにすれば
SELECT COUNT(DISTINCT email) FROM users;
で良いですが、これだと非常に速度が遅いです。
これをどうにかして高速化できないでしょうか?
試したこと
group byを利用して見ましたが、特に速度は改善されませんでした。
SELECT email FROM users group by email;
調べたこと
EXISTS句というのを使えば高速化できるという記事をいくつか拝見しましたが、他テーブルとの関連はなく、あくまでusersテーブル内で完結するものなので使えなさそうでした。
解決したいこと
どうにかDISTINCT以外を利用して高速化させたいのですが、何か良い案はありますか?
ここまでシンプルなものだとこれ以上早くはできないでしょうか?
追記
すみません、少し質問内容がふわっとしていたので追記させてください。
今回はIndex等は考慮せず(全てのカラムにIndexはないものとして)、上記テーブルでユニークなemail数を調べたいという要件を満たす最速のクエリが知りたいというのが質問になります。
レコード数が多い場合、SELECT COUNT(email) FROM usersよりSELECT COUNT(distinct email) FROM usersの方が遅いのは明らかで、SELECT COUNT(distinct email) FROM usersより早いユニークなemail数を調べたいという要件を満たすクエリが知りたいです。
単純にないというのであれば別のアプローチ(Indexの見直し等)を行おうと思っています。
それでもexplainの結果等があった方が良いというのであれば追記します。
回答2件
あなたの回答
tips
プレビュー