Postgresql
PostgreSQL 上的索引條件聚合查詢
如何優化 PostgreSQL 上的條件聚合查詢?
這種查詢的一個例子是:
SELECT SUM(score) FROM "games" WHERE "PlayerId" = 23 AND "status" = 'FINAL';
索引
(PlayerId, status)
將有助於過濾器,有什麼技巧或想法可以優化過濾後的聚合?理想的做法是不涉及外部記憶體機制,以及每次更新“遊戲”表時保持執行 SUM 的保存機制——類似於記憶體的工作方式,但更可靠。
您必須創建一個特殊的表來包含總和。
然後在原始表上創建觸發器,添加插入的值,減去刪除的值,進行更新並在截斷時將值設置為零。
您可以在我的部落格文章中看到一個關於
count
聚合的小範例。與該範例不同,您將必須有一個求和表,其中每個和一個總和。"PlayerId"``status
索引(PlayerId,狀態)將有助於過濾器,任何技巧或想法來優化聚合後過濾?
是的,將索引設為 on
("PlayerId", status,score)
或也許("PlayerId", score) WHERE status='FINAL'
. 然後可以在僅索引掃描中從索引中檢索和求和分數,而無需訪問表。為此,您可能必須經常清空表格以保持大多數頁面全部可見。但是,如果表集中更新到位於隨機位置的行,那麼 VACUUM 甚至可能不夠頻繁。
這是最簡單的,所以是我的第一選擇。如果不夠好,那麼可以使用觸發器來實時維護匯總表,或者嘗試使用分區將相關數據緊密地保存在磁碟上。