之前有写过一个案例,order by limit因为数据分布不均而选择了错误的索引,这是由于优化器没法判断数据的分布关系,默认认为数据分布是均匀的所导致的。
而除了limit,当我们在使用游标时也要注意有可能会出现类似的情况。而往往这类在存储过程中的SQL我们更难发现其选择了错误的执行计划,所以需要注意。
1、建测试表
bill=# create table tbl (id int, c1 int, c2 int, c3 int, c4 int);
CREATE TABLE
2、写入一批随机数据,ID从1到1000万。
bill=# insert into tbl select generate_series(1,10000000), random()*100, random()*100, random()*100, random()*100;
INSERT 0 10000000
3、写入另一批100万条数据,c1,c2 与前面1000万的值不一样。
bill=# insert into tbl select generate_series(10000001,11000000), 200,200,200,200;
INSERT 0 1000000
4、创建两个索引,也就是本文需要重点关注的,到底走哪个索引更划算
bill=# create index idx_tbl_1 on tbl(id);
CREATE INDEX
bill=# create index idx_tbl_2 on tbl(c1,c2,c3,c4);
CREATE INDEX
5、收集统计信息
bill=# vacuum analyze tbl;
VACUUM
6、查看下面SQL的执行计划,走了正