9

列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)

インデックスについての私の理解は限られていますが、そのようなクエリはインデックスの目的だと思いました。

4

3 に答える 3

6

このクエリは、ルーズ インデックス スキャンと呼ばれる最適化を使用して実行できます。ただし、PostgreSQL はこの最適化をまだ実装していないため、代わりにテーブル スキャンを使用します。

主要なデータベースのうち、私の知る限り、緩やかなインデックス スキャンを実装しているのは MySQLだけです (おそらく Oracle も?)。PostgreSQLはこの機能を実装していません。

于 2011-02-04T23:21:51.047 に答える
5

クエリは確かにインデックスを使用できます。特定のケースでそうでない理由は、データの特定のサイズと分布によって異なります。SET enable_seqscan TO off調べるのに使えます。

于 2011-02-06T20:31:20.447 に答える
3

テーブル全体をスキャンする必要があるため、インデックスを介してスキャンしてもメリットはありません。(「カバーリングインデックス」は、MVCCが実装されているため、PostgreSQLのパフォーマンス手法としては役立ちません)。

于 2011-02-04T22:52:49.287 に答える