7

PostgreSQL でのクエリのパフォーマンスに関するヘルプが必要です。インデックスに関係しているようです。

このクエリ:

  • によるフィルタリングtype
  • timestamp、昇順:

SELECT * FROM the_table WHERE type = 'some_type' ORDER BY timestamp LIMIT 20

インデックス:

 CREATE INDEX the_table_timestamp_index ON the_table(timestamp);

 CREATE INDEX the_table_type_index ON the_table(type);

フィールドの値は、type約 11 の異なる文字列のうちの 1 つにすぎません。問題は、クエリが O(log n) 時間で実行されるように見え、実行に数分かかる
いくつかの値を除いて、ほとんどの場合数ミリ秒しかかからないことです。type

これらのサンプル クエリでは、最初のクエリの実行に数ミリ秒しかかからず、2 番目のクエリは 30 分以上かかります。

SELECT * FROM the_table WHERE type = 'goq' ORDER BY timestamp LIMIT 20
SELECT * FROM the_table WHERE type = 'csp' ORDER BY timestamp LIMIT 20

約 90% の確率で、私たちが持っているインデックスは正しいものではないと思います。インデックスのパフォーマンスに関するこの同様の質問を読んだ後、私たちが必要としているのは と の複合インデックスである可能性が最も高いtypeと思いますtimestamp

私が実行したクエリプランは次のとおりです。

  1. WHERE期待されるパフォーマンス、タイプ固有のインデックス (つまり、句で type = 'csq' を持つ新しいインデックス)。
  2. 上記のインデックスは、最も遅く、問題のあるケースです。
  3. 高速ケース、上記と同じインデックス。

どうもありがとうございました! どんなポインタでも本当に感謝します!

4

2 に答える 2

2

索引は、where節または節のいずれにも使用できますorder by。indexthetable(type, timestamp)を使用すると、同じインデックスを両方に使用できます。

私の推測では、Postgres は、収集した統計に基づいて、使用するインデックスを決定しています。where にインデックスを使用してから並べ替えを試みると、パフォーマンスが非常に悪くなります。

これは推測にすぎませんが、上記のインデックスを作成して、パフォーマンスの問題が解決するかどうかを確認する価値があります。

于 2013-01-31T20:42:39.180 に答える
2

Explain 出力はすべて、タイムスタンプ インデックスを使用します。これはおそらく、タイプ列のカーディナリティが低すぎて、その列のインデックスのスキャンがテーブル スキャンと同じくらいコストがかかるためです。

作成する複合インデックスは次のようにする必要があります。

create index comp_index on the_table ("timestamp", type)

その順番で。

于 2013-01-31T21:03:20.830 に答える