我有一個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"
嘗試VACUUM ANALYZE。 – randomguy
謝謝,現在就試試吧! –
你有什麼特權從某個時間點備份舊數據,只保留最近的數據量? – bonCodigo