数据库 ORACLE 11g
看例子:
表pm_project,有数据10万条,id 5000000-5100000
执行计划走一波explain plan for下面的SQL:
-- 走索引 唯一扫描 BY INDEX ROWID unique scan
select * from pm_project where pm_project_id
in (5000041, 5000042);
-- 走索引 区间扫描 BY INDEX ROWID range scan
select * from pm_project where pm_project_id
in (select pm_project_id from pm_project where pm_project_id < 5000025);
-- 全表扫描 full
select * from pm_project where pm_project_id
in (select pm_project_id from pm_project where pm_project_id > 5000025);
那是为什么呢?
第一条,写死的值,oracle通过优化器选择走唯一索引。
第二条,子查询有25条记录,oracle通过优化器选择了索引 range scan。
第三条,子查询有9万多条记录,oracle通过优化器选择了全表扫描,因为整个表才10万条,没必要走索引了。
那么问题来了,这个优化器怎么就这么做出选择了呢?