Postgresql

PostgreSQL 上的索引條件聚合查詢

  • January 29, 2022

如何優化 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 甚至可能不夠頻繁。

這是最簡單的,所以是我的第一選擇。如果不夠好,那麼可以使用觸發器來實時維護匯總表,或者嘗試使用分區將相關數據緊密地保存在磁碟上。

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