POSTGRESQL:なぜこの簡単なクエリがインデックスを使用しないのですか?
-
29-10-2019 - |
質問
列Cを備えたテーブルTがあります。これはINTであり、BTREEインデックスがあります。
なぜ次のクエリがこのインデックスを利用しないのですか?
explain select c from t group by c;
結果は次のとおりです。
HashAggregate (cost=1005817.55..1005817.71 rows=16 width=4)
-> Seq Scan on t (cost=0.00..946059.84 rows=23903084 width=4)
インデックスの理解は限られていますが、そのようなクエリはインデックスの目的であると思いました。
解決
クエリは確かにインデックスを使用できます。特定のケースではそうでない理由は、データの特定のサイズと分布に依存します。使用できます SET enable_seqscan TO off
調べる。
他のヒント
このクエリは、aと呼ばれる最適化を使用して実行できます ルーズインデックススキャン. 。ただし、PostgreSQLはまだこの最適化を実装していないため、代わりにテーブルスキャンを使用します。
私が知っている限り、主要なデータベースの MySQLはルーズインデックススキャンを実装しています (おそらくオラクルも?)。 postgreSql そうではありません この機能を実装しました。
テーブル全体をスキャンする必要があるため、インデックスを介してそれを行うことは利点がありません。 (「カバーインデックス」は、MVCCの実装により、PostgreSQLのパフォーマンス手法として役立ちません)。
所属していません StackOverflow