2016-09-20 100 views
0

我有一個包含數據,connected_id(傳感器)和時間戳的測量數據表。我正在搜索此表以獲取特定傳感器的第一個時間戳。對於某些傳感器,我在2ms內得到結果,其他傳感器需要幾秒鐘才能完成。此外,當我刪除搜索特定傳感器的條件時,結果在毫秒內。具有不同性能的相同postgresql查詢

screen shot with <code>EXPLAIN ANALYZE</code> output

兩個查詢使用相同的計劃,正在使用PostgreSQL 8.4在同一臺服務器上執行。我已經對數據庫進行了真空分析,並在postgresql.conf文件中查詢計劃。

我已經嘗試過創建,connected_id和這兩列上的btree和hash索引。這沒有任何區別。

+6

不要截圖文本,而是將其粘貼到文本中。 – oals

+0

如何定義索引'data_index'? – donkopotamus

+0

它也取決於數據量。 count(*)'返回兩組條件的值是多少? – Rahul

回答

0

所選查詢計劃按升序搜索按created排序的索引,並在找到匹配的第一行時停止搜索connected_id

現在有connected_id = 19created,所以很快找到了匹配。

但顯然connected_id = 26的所有行都有相當高的created,所以查詢必須在找到匹配之前掃描許多索引條目。

這解釋了區別。
如果您使用的是PostgreSQL版本較新的較不受支持的版本,則可以使用更多的診斷程序來顯示發生的情況,如EXPLAIN (BUFFERS)

我會創建一個多列索引(connected_id, created)加快此查詢。

+0

謝謝你的回答。我嘗試過'(created,connected_id)'多列索引。首先在connected_id上進行排序是有道理的。會嘗試讓你知道結果。 – slonkie

相關問題