是否有可能擁有一個只存在於 RAM 中的臨時、即時的 PostgreSQL 表?
我知道 PostgreSQL 只對足夠小的表自動使用 RAM。但我說的不僅僅是表內的數據,而是整個表本身。
基本上,我(很差)在 PHP 數組中重新實現了各種數據庫功能,例如,當我從 API 獲取數據並想要在我的控制面板中顯示之前對其進行排序或“按摩”時。在這種情況下,擁有一個僅用於此目的的實際數據庫表(至少對我而言)是沒有意義的,並且帶有臨時數據。如果我可以即時創建一個表,我會在 RAM 中填充該表,然後使用普通的 PG SQL 查詢對其進行排序,然後從中獲取記錄,那就更好了。
這是一回事嗎?我有數組結構和各種試圖模仿 SQL 的“排序依據”的函式,這感覺很愚蠢。
當然,我不是在說執行
CREATE TABLE
,將數據添加到其中,然後再次將其返回給 PHP,然後DROP TABLE
. 這對性能來說是非常糟糕的。如果沒有辦法做到這一點,我會接受它,但這是我經常認為非常有意義的事情。
您可能錯過了明顯的候選人:a
TEMPORARY TABLE
.如果已使用該
temp_buffers
設置分配了足夠的 RAM,則它存在於記憶體中。只有目前會話可以看到它,沒有為它編寫 WAL(這是它更快的主要原因),並且它在會話結束時自動刪除。如果它必須超過目前會話,請考慮
UNLOGGED TABLE
改為。請注意,臨時表不包含在
autovacuum
. 看:但是正常系統目錄中仍然有條目,因此它不是 100%“在 RAM 中”。
手冊中的詳細資訊
CREATE TABLE
。
數據庫伺服器 RAM 總是稀缺的,所以最好保留它來記憶體許多客戶端經常需要的東西,比如最常訪問的行等。
Postgres 不支持僅 RAM 表。但是如果是這樣,如果你有很多客戶端創建 RAM 表,你必須非常小心,不要在伺服器上使用太多 RAM 來儲存只有客戶端使用的數據,同時大量請求會影響其他數據然後可以將其推出記憶體,從而降低整體性能。
所以,普通或臨時表就可以了。如果有足夠的 RAM 可用,它們將留在 RAM 中,但伺服器也可以將它們寫入磁碟以釋放一些緩衝區。如果您使用非臨時表,請確保將它們創建為 UNLOGGED,以便寫入不會轉到 WAL。它們不會防崩潰,但這對於記憶體表並不重要。
不過,您所說的有道理:浪費伺服器 CPU 來做美容工作是沒有意義的,如果可能的話,最好在應用程序端進行,因為添加 Web 伺服器 CPU 比添加數據庫 CPU 容易得多。數據庫的工作是快速處理數據,而不必太關心表格在應用程序端將如何顯示。此外,一些展示/化妝品的東西在應用程序端更容易做。
如果還需要在數據庫端做一些數據按摩,可以使用臨時表,但也可以使用 CTE,因為不涉及建表,所以速度更快。像:
WITH query1 AS (get some data) SELECT something FROM query1
該規則的一個重要例外是大而慢的搜尋查詢,然後使用分頁顯示。通常,無論是返回一頁還是十頁結果,大型慢速搜尋查詢都會使用盡可能多的數據庫資源。然後,為了不在每個頁面上重做查詢,記憶體結果是很有意義的。當然,這也適用於其他類型的慢查詢。
您可以將該記憶體放在會話中、memcached 中,甚至是特殊的 UNLOGGED 表中,基本上可以放在任何比進行大而慢的查詢檢索更快的地方。