PostgreSQL中UNION排序是否利用索引?预排序能否提升性能?
关于UNION ALL与ORDER BY的索引利用及性能问题
问题背景
现有两个独立表top_rated_films与most_popular_films,二者均包含索引字段release_date。
问题1
执行如下SQL语句时,语句中的ORDER BY是否会利用索引?
SELECT * FROM top_rated_films UNION ALL SELECT * FROM most_popular_films ORDER BY release_date;
问题2
若上述语句的ORDER BY无法利用索引,执行如下SQL语句时,通过预排序第一个数据集能否提升查询速度?
SELECT * FROM top_rated_films ORDER BY release_date UNION ALL SELECT * FROM most_popular_films ORDER BY release_date;
回答
问题1结论:不会利用索引
UNION ALL会先合并两个表的结果集生成一个临时集合,之后才对这个临时集合执行ORDER BY排序。由于临时集合不存在release_date索引,排序操作只能遍历全部临时数据完成,无法借助原表的索引。
问题2结论:预排序第一个数据集无法提升查询速度
外层的ORDER BY是对合并后的完整结果集做全局排序,不管第一个子查询是否提前排序,最终都要将两个结果集合并后重新执行整体排序。提前给第一个表排序不仅没有优化效果,反而会多执行一次无意义的排序操作,额外消耗CPU和内存资源。
内容的提问来源于stack exchange,提问作者RobKohr
相关产品推荐
相关产品推荐

