Postgres 可以在不掃描所有行的情況下最佳化分組最大查詢嗎?
Postgres 缺乏一種直接的方法來有效地最大化群組查詢,從在給定的情況下觀察到昂貴的全表掃描
解決方案
為了避免過度掃描,請考慮使用選項查找表並透過option_id 連結到記錄表。在這些表之間建立外鍵約束將保持引用完整性。
SQL FOR LOOKUP TABLE CREATION:
CREATE TABLE options ( option_id int PRIMARY KEY , option text UNIQUE NOT NULL );
從現有記錄表插入資料:
INSERT INTO options SELECT DISTINCT option_id, 'option' || option_id FROM records;
最佳化使用子查詢查詢:
SELECT option_id, (SELECT max(id) FROM records WHERE option_id = o.option_id) AS max_id FROM options o ORDER BY 1;
或者,最佳化子查詢可以擷取最大id:
SELECT option_id, (SELECT id FROM records WHERE option_id = o.option_id ORDER BY id DESC NULLS LAST LIMIT 1) AS max_id FROM options o ORDER BY 1;
查詢效能的最佳索引:
CREATE INDEX ON records (option_id, id DESC NULLS LAST);
這種最佳化方法透過利用索引掃描甚至對查找表和主表進行僅索引掃描,與全表掃描相比具有卓越的性能。
以上是Postgres 可以在不進行全表掃描的情況下最佳化 Groupwise MAX 查詢嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!