2016-03-03 38 views
0

我想提高我的數據庫,簡化裝配的性能PostgreSQL的性能提示如下:散亂數據

編輯

  • 一個表有3行(id_device,時間戳,數據)與複合B樹索引(id_device,時間戳)
  • 1K設備發送數據的每一分鐘

插入速度非常快,因爲PostgreSQL只是按照收到的順序寫入行。但是,當試圖通過給定設備的連續時間戳獲取多個數據時,查詢速度並不快。我的理解是,由於收集數據的方式,表格每頁上的給定設備的行數不會超過一行。因此,如果我想要獲得給定設備連續時間戳的10k數據,PostgreSQL必須從磁盤讀取10k頁。此外,由於可以在任何1k設備上完成此操作,因此這些頁面不會保存在RAM中。

我試過CLUSTER表,它確實解決了性能問題,但是這個操作非常長(〜1天),並且鎖定了整個表,所以我放棄了這個解決方案。

我已經閱讀了有關分區的內容,但是如果每次連接新設備時都需要添加新表格,這就意味着需要大量腳本,並且在我看來,這有點容易出錯。

我對這個設置不是特別原創的事實很有信心,那麼我可以使用一個建議嗎?

感謝您的閱讀, 紀堯姆

+0

如果您的查詢只檢查時間戳,則應該僅在時間戳上添加索引。 – Renzo

+0

我編輯了這個問題,因爲我的設置過於簡單。還有一些數據可以檢索。 – gdlr

回答

0

我猜你的指數也有選擇性低,因爲你第一次索引DEVICE_ID(這是唯一的1000個不同的),而不是時間戳第一。

取決於您對提取的數據所做的操作,但也許解決方案可能會對操作進行批處理,例如在預定時段內提取數據並一次處理所有1000個設備的數據。

+0

批處理操作確實是我正在考慮的操作,並將處理後的數據存儲在另一個表中。我正在考慮日常工作,它會將每天的數據列表存儲爲一行,以便這些數據保持在一起。但是,我的問題實際上是:我正確使用PostgreSQL還是缺少一些東西? – gdlr

+0

我不認爲這裏有很多事情要做。您在PostgreSQL中存儲數據時,如果您無法分割它,例如。根據device_id,那麼唯一合理的解決方案就是批量處理數據,因爲如果你觸摸每一千條記錄或全部記錄,它沒有多大區別。 – hruske

+0

感謝您的回覆。我不知道分片,我會看看這個。 – gdlr