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中文网其他相关文章!