2013-01-31 63 views
7

需要有關PostgreSQL中查詢性能的幫助。這似乎與指數有關。PostgreSQL中的索引查詢性能不穩定

這個查詢:根據timestamptype

  • 訂單,上升

    • 過濾器:

    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個不同字符串中的一個。
    問題是查詢似乎在O(log n)時間內執行,除了一些值爲type的運行幾分鐘的時間外,最多隻需要幾毫秒。

    在這些示例查詢,第一隻需要幾毫秒的時間來運行,而第二個需要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

    太棒了!所以,索引中列的順序有所不同? –

    +0

    @JuanCarlosCoto。 。 。事實上,訂單確實有所作爲。通過首先放置'timestamp',引擎就不能使用where子句的索引。各種類型將分散在整個指數。 –