簡體   English   中英

處理龐大的 postgres 數據庫的最佳方法

[英]Best way to deal with huge postgres database

我創建了一個將大量數據收集到 Postgres 數據庫的刮板。 其中一張表有超過 1.2 億條記錄,並且還在增長。 即使是簡單的選擇也會產生明顯的問題,但是當我運行像COUNT()這樣的聚合函數時,需要很長時間才能得到結果。 我想用一個web服務來顯示這個數據,但是直接做肯定太慢了。 我考慮過物化視圖,但即使在那里我運行一些更高級的查詢(使用子查詢查詢以顯示趨勢),它也會拋出 memory 不足的錯誤,如果查詢很簡單,則大約需要一個小時才能完成。 我在詢問處理如此龐大的數據庫的一般規則(我還沒有找到任何規則)。 我使用的示例查詢:

簡單查詢大約需要一個小時才能完成(Items 表有 1.2 億條記錄,ItemTypes 有大約 30k - 它們保留了 Items 的名稱和所有信息)

SELECT 
  IT."name", 
  COUNT("Items".id) AS item_count,
  (CAST(COUNT("Items".id) AS DECIMAL(10,1))/(SELECT COUNT(id) FROM "Items"))*100 as percentage_of_all
FROM "Items" JOIN "ItemTypes" IT on "Items"."itemTypeId" = IT.id
GROUP BY IT."name"
ORDER BY item_count  DESC;

當我使用返回COUNT("Items".id) AS item_count % 趨勢的子查詢運行上述查詢時,這是一周前的計數與現在的計數相比,它會拋出一個錯誤,即 memory 已超出。

正如我在上面所寫的,我正在尋找提示,如何優化它。 我計划優化上述查詢的第一件事是將名稱從 ItemTypes 移動到 Items,再到 Items。 不再需要加入 ItemTypes,但我已經嘗試模擬它,結果並沒有好很多。

您不需要子查詢,因此等效版本是:

SELECT IT."name", 
       COUNT(*) AS item_count,
       COUNT(*) * 100.0 / SUM(COUNT(*)) OVER () as percentage_of_all
FROM "Items" JOIN 
     "ItemTypes" IT 
     ON "Items"."itemTypeId" = IT.id
GROUP BY IT."name"
ORDER BY item_count  DESC;

我不確定這是否會解決您的資源問題。 此外,這假定所有項目都有一個有效的ItemType 如果不是這種情況,請使用LEFT JOIN而不是JOIN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM