[英]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.