質問

列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のパフォーマンス手法として役立ちません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top