暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle性能优化:SQL优化思路之十三——组合索引

oracleEDU 2017-11-08
931

组合索引(concatenated index):由多个列构成的索引

创建组合索引例:

create index idx_detp on detp(col1,col2,col3,....)

idx_dept索引为组合索引。

在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列。

当我们进行查询时where 限制条件必须有引导列。

组合索引要素

1. 适用在单独查询返回记录很多,组合查询后忽然返回记录很少的情况:

比如where 学历=硕士以上 返回很多的记录

where 职业=收银员 同样返回很多的记录

于是无论哪个条件查询做索引,都不合适。

可是,如果学历为硕士以上,同时职业又是收银员的,返回的就少之又少了。

于是组合索引就可以这么开始建了。

2. 组合查询的组合顺序,要考虑单独的前缀查询情况(否则单独前缀查询的索引不能生效或者只能用到跳跃索引):

比如在建id,object_type的组合索引时,要考虑是单独where id=xxx 查询的记录多,还是单独where object_type=xxx 查询的记录多。

3. 仅等值无范围查询时,组合索引顺序不影响性能(比如where col1=xxx and col2=xxx,无论col1+col2组合还是col2+col1组合)

4. 不等值有范围查询时,组合索引的最佳顺序

通过案例说明

构建环境:

SQL> create table t as select * from dba_objects;

SQL> insert into t select * from t;

SQL>

SQL>

SQL> update t set object_id=rownum;

SQL> commit;

等值无范围查询时,组合索引顺序不影响性能的案例

建立不同顺序的组合索引

id+type组合:

SQL> create index idx_id_type on t(object_id,object_type);

type+id组合:

SQL> create index idx_type_id on t(object_type,object_id);

SQL> alter session set statistics_level=all;

SQL> set linesize 500

SQL> select *+index(t,idx_id_type)*/ * from  t  where object_id=20  and object_type='TABLE';

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

SQL> select *+index(t,idx_type_id)*/ * from  t  where object_id=20  and object_type='TABLE';

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

等值物无范围查询,性能一样。

组合索引最佳顺序 -- 将列等值查询条件的列置前

组合索引在条件不等的案例(条件经常是不等的,要放在后面,让等值的在前面)

不等值条件放前面的情况:

SQL> select *+index(t,idx_id_type)*/ *  from   t where object_id>=20 and object_id<2000 and object_type='TABLE';

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));


等值的条件放前面的情况:

select /*+index(t,idx_type_id)*/ *  from  t  where object_id>=20 and object_id<2000   and object_type='TABLE';

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));


可见列等值的条件放前面的组合索引效率高。



最后修改时间:2021-04-28 20:26:28
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论