PostgreSQL中排序查询数组,能否提升B-tree索引的查询性能?
问题解答
提前排序数组对查询性能的影响
提前排序ANY子句里的数组几乎没什么性能影响,不用特意去做。
具体原因
- PostgreSQL处理
= ANY(...)条件时,不管你传入的数组是不是有序的,引擎内部都会自动对数组元素做去重、排序处理,再基于B-tree索引进行批量查找。也就是说,你手动提前排序的操作,数据库本来就会做一遍,所以不会带来额外的性能收益。 - 就算数组有100个元素,排序本身的成本极低,不管是你提前做还是数据库做,对整个1.8亿行表的查询耗时来说,这点开销完全可以忽略。
规避缓存干扰的测试方法
如果想通过explain analyze验证,可以试试这些方法消除缓存影响:
- 每次测试前执行
SELECT pg_stat_reset();重置统计数据,再用DISCARD ALL;清空当前会话的缓存;如果允许的话,重启数据库清除共享缓存。 - 多次执行
explain analyze取平均耗时,或者用pg_prewarm工具控制缓存状态,尽量让两次测试的缓存环境一致。
内容的提问来源于stack exchange,提问作者Andrei Bodakin
相关产品推荐
相关产品推荐

