表上的索引是根据什么建立的,特别是组合索引,有多个的时候优化器又怎么选择使用哪个呢,
今天做个试验验证下
新建这个表testindex
表结构
Name Type Nullable Default Comments
---------- ------------- -------- ------- --------
CREATETIME DATE Y
LOC VARCHAR2(100) Y
STATUS VARCHAR2(20) Y
COL1 VARCHAR2(10) Y
testindex上只有两个索引
right1 loc,createtime,status
right2 createtime,loc,status
收集表统计信息
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname => 'TEST',
tabname => 'TESTINDEX',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'for all columns size skewonly',
cascade=>TRUE
);
END;
收集统计信息可参考
http://blog.csdn.net/robinson1988/article/details/5329522
根据条件取值范围不同执行sql
Select *
From testindex
Where CREATETIME = :1
And loc > :3
And status =:4
走createtime,loc,status索引
Select *
From testindex
Where CREATETIME > :1
And loc = :3
And status =:4
走loc,createtime,status索引
说明选择组合索引时根据查询条件判断,取值越精准,范围越小的字段createtime/loc放前面的索引越优先被选择
这里收集统计信息还是很必要的,上面这个选择索引的规则和直方图,是否有其他索引关系应该不大