改進 PostgreSQL 中的準確計數機制
我有一個問題我已經面臨了一段時間並且被忽略了一段時間。行數問題。我讀過它很慢,因為 PostgreSQL 必須驗證每一行,因此必須進行順序掃描。我目前正在使用 PostgreSQL 13。
我遇到的潛在解決方案:
- 使用估計。
雖然查詢單個表時估計更接近,但使用連接時結果相差甚遠。我還想要準確的計數,因為我需要向使用者顯示確切的數字,比如他做了多少交易。 2. 使用外部表來維護計數。
這裡的想法是使用規則或在插入觸發器之後使用更新計數
count = count + 1
這裡的問題是使用者可以添加多個過濾器(如日期、使用者 ID 等),這將更改計數但外部表僅儲存計數。我將如何解決這個問題?我正在嘗試將計數時間減少到 3-4 秒以下。目前,一個表中有近 10 億條記錄,雖然這個表每個月被分成 12 個分區。這甚至可能嗎?
11 個分區不會有插入但可以有刪除操作。使用者可以應用過濾器來更改任何分區的計數。
我在日期列上使用 b 樹索引。在解釋分析中,正在使用索引,但由於記錄很大,b-tree 索引無法放入 RAM,因為它的大小也很大。
這些表按月分區,每個分區都有一個日期索引,這意味著每個月都有一個索引。
使用大表,您將無法避免 I/O,並且查詢永遠不會很快。對大量數據進行非常快速的聚合併不是 PostgreSQL 的強項。你想要一個列儲存(PostgreSQL 有一個列儲存擴展)。
如果您使用表,PostgreSQL 可以通過查看可見性映射
VACUUM
來避免查找行。如果 11 個分區是靜態的,只有一個處於活動狀態,則可以儲存靜態分區的總數並將活動分區的行數添加到該總數中。如果使用者可以應用過濾器,則無法擺脫實際計算匹配的行數。您可能需要某種匯總數據的數據倉庫。
如果您的數據具有您正在搜尋的可預測值,您可以建構可以載入到 RAM 中並有效使用的部分索引。
CREATE INDEX table_type_value1 ON table(ordered_value) WHERE type=value1
為查詢服務
SELECT ordered_value FROM table WHERE type=value1
type
對於要優化的每個值,您都需要一個索引。在您的描述中,排序列是日期,條件可以是實際搜尋的日期範圍(今天、上周等)