2012-12-03 127 views
1

我有一個PostgreSQL數據庫,其中包含大量行〜160,000,000。數據庫基本上是一組網絡日誌。有一個稱爲時間的列是時間戳。基本上每個獨特的時間都有一個網絡上每臺機器的日誌。因此有多行具有相同的時間戳記。即PostgreSQL索引性能問題

time ip    value 
2:00 192.168.1.1 5 
2:00 192.168.1.2 4 
2:00 192.168.1.3 5 
3:00 192.168.1.1 3 
3:00 192.168.1.2 5 
3:00 192.168.1.3 2 
etc  etc 

現在我已經創建了這個數據庫的時間索引,因爲這是我總是查詢關係的字段。

i.e. select * from networklogs where time = '2:00' and value = 5 

由於查詢必須掃描整個數據庫,所以不使用索引,每個查詢大約需要2分鐘。我創建了索引,以便我的查詢將查找包含匹配時間的數據子集,然後基於來自此處的另一個值進行過濾,因此我希望查詢速度更快。

但是查詢現在似乎需要更長的時間......

這很奇怪,因爲在pgAdmin的它解釋說,查詢將使用時間指數和時間指數從總縮小數據〜800000件160,000,000,然後查詢過濾器將該數據縮小到1,700個項目。這個解釋需要17ms,但是如果我運行查詢需要3分鐘。

這應該比搜索160,000,000個項目上的兩個匹配標準更快!

我不知道爲什麼它不會更快,我想知道是否即使pgAdmin解釋查詢爲使用時間索引,它實際上使用它時執行查詢嗎?

有沒有人有任何想法或建議?

謝謝, 詹姆斯

更新:我已經運行EXPLAIN分析其對以下命令:

explain analyze select latitude,longitude from networklogs where value = 5 and time = '2:00' 

的結果是:

"Bitmap Heap Scan on networklogs (cost=13178.17..1488620.94 rows=848 width=19) (actual time=3507.923..278760.509 rows=33 loops=1)" 
" Recheck Cond: (time = '2:00'::timestamp without time zone)" 
" Rows Removed by Index Recheck: 38302021" 
" Filter: (value = 5)" 
" Rows Removed by Filter: 882873" 
" -> Bitmap Index Scan on timeindex (cost=0.00..13177.95 rows=530111 width=0) (actual time=695.771..695.771 rows=882906 loops=1)" 
"  Index Cond: (time = '2:00'::timestamp without time zone)" 
"Total runtime: 278764.148 ms" 
+0

嘗試VACUUM ANALYZE。 – randomguy

+0

謝謝,現在就試試吧! –

+0

你有什麼特權從某個時間點備份舊數據,只保留最近的數據量? – bonCodigo

回答

3

如果這些主要是您要執行搜索的參數,我會建議在它們上創建一個多重索引。因爲在你的實際情況下,數據庫有一個時間索引,所以它能夠知道哪些行匹配這個條件,但是它必須從索引給出的所有不同位置獲取它們,然後檢查次要條件。

CREATE INDEX time_and_value ON networklogs (time, value); 

使用該索引,數據庫就不必爲了檢查另一條件數據提取,它會簡單地獲取它知道已經符合搜索條件的數據。訂單當然很重要。

我看你使用的是經緯度數據,可能使用point型將是很好的,如此你就可以使用所有都默認使用的Postgres的geometric operators。這些數據也可以編入索引。

+0

查看EXPLAIN輸出,'time'索引在0.7秒內匹配882,906行。然後數據庫需要27.1秒才能獲取所有這些行(可能是因爲[大量磁盤搜索](http://stackoverflow.com/a/13236089/1026671)),僅丟棄了其中的99.996%。你肯定需要在兩列上都有一個索引。 – willglynn

+0

對不起,這是278秒(3.16毫秒/行),而不是27秒。聽起來像隨機讀取給我。 – willglynn

+0

感謝您的答案。那麼我需要創建幾個多重索引,這可能嗎?例如,我的實際數據庫有比上面顯示的示例更多的列。我會需要一些像時間和價值,時間&國旗,時間&noconn等指標... –

2

PostgreSQL有EXPLAIN and EXPLAIN ANALYZE研究如何查詢運行。 PG Admin很可能使用EXPLAIN來告訴你查詢將如何運行;您可以使用EXPLAIN ANALYZE獲得更準確的結果,它實際運行查詢並從實際運行中生成統計信息。你至少可以看到時間花在什麼地方,即使它按照預期使用索引。

+0

謝謝,現在就試試吧! –

+0

我運行解釋分析,但請你向我解釋這是什麼意思:「網絡日誌上的位圖堆掃描(成本= 13178.17..1488620.94行= 848寬度= 19)(實際時間= 3507.923..278760.509行= 33循環= 1)「'就時間和行動而言?這是從輸出的第一行的方式... –

+0

完整輸出已添加到我的原始文章作爲更新。 –