Postgresql

改進 PostgreSQL 中的準確計數機制

  • May 17, 2021

我有一個問題我已經面臨了一段時間並且被忽略了一段時間。行數問題。我讀過它很慢,因為 PostgreSQL 必須驗證每一行,因此必須進行順序掃描。我目前正在使用 PostgreSQL 13。

我遇到的潛在解決方案:

  1. 使用估計。

雖然查詢單個表時估計更接近,但使用連接時結果相差甚遠。我還想要準確的計數,因為我需要向使用者顯示確切的數字,比如他做了多少交易。 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對於要優化的每個值,您都需要一個索引。

在您的描述中,排序列是日期,條件可以是實際搜尋的日期範圍(今天、上周等)

引用自:https://dba.stackexchange.com/questions/291306