2013-01-31 6 views
7

PostgreSQLでのクエリのパフォーマンスに関するヘルプが必要です。それはインデックスに関連しているようです。 timestampによってtype PostgreSQLでの不規則なインデックス付きクエリのパフォーマンス

  • 注文に係る

    • フィルタ、昇順:

      このクエリは、

    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つです。
    問題は、クエリが実行に数分かかるというtypeのいくつかの値を除いて、たった数ミリ秒でほとんどO(log n)時間で実行されているようです。これらの例のクエリで

    秒は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%の確信を持って、疑います正しいもの。私は、this similar question about index performanceを読んだ後、私たちが必要とするのは、typetimestampを超える複合インデックスです。

    クエリは、私が実行していることを計画して現在地:

    1. Expected performance, type-specific index (i.e. new index with the type = 'csq' in the WHERE clause)。
    2. Slowest, problematic case, indexes as described above.
    3. Fast case, same indexes as above.

    おかげであなたの助けのために非常に多くの!すべてのポインタは本当に感謝されます!

  • +0

    インデックスのサイズはどのくらいですか?そしてデータセットのサイズ? – Gothmog

    答えて

    2

    インデックスは、where句またはorder by句のいずれかに使用できます。インデックスthetable(type, timestamp)の場合、両方に同じインデックスを使用できます。

    私の推測では、Postgresは収集する統計に基づいてどのインデックスを使用するかを決定していると思います。 whereのインデックスを使用してソートを試みると、実際にパフォーマンスが低下します。

    これは単なる推測ですが、上記のインデックスを作成してパフォーマンス上の問題を修正するかどうかを確認する価値があります。

    +0

    ありがとう!試してみる:) –

    2

    説明出力はすべてタイムスタンプ索引を使用します。これは、型列のカーディナリティが低すぎるため、その列の索引のスキャンが表スキャンと同じくらい高価なためです。

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

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

    そのためには。

    +0

    恐ろしい!だからインデックスの列の順序との違いはありますか? @JuanCarlosCoto。 –

    +0

    。 。実際、注文は違いを生みます。 'timestamp'を最初に置くことによって、エンジンは' where'節のためにインデックスを使うことができません。さまざまな種類がインデックス全体に分散されます。 –

    関連する問題