千家信息网

索引优化十二--组合索引的优化技巧与总结

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,组合索引经要素!/* 1.适用在单独查询返回记录很多,组合查询后忽然返回记录很少的情况:比如where 学历=硕士以上 返回不少的记录比如where 职业=收银员 同样返回不少的记录于是无论哪个条件查
千家信息网最后更新 2026年11月02日索引优化十二--组合索引的优化技巧与总结

组合索引经要素!


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


比如where 学历=硕士以上 返回不少的记录

比如where 职业=收银员 同样返回不少的记录

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

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

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

*/


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

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

这里细节就暂时略去了,在案例的部分中还有描述

*/




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


drop table t purge;

create table t as select * from dba_objects;

insert into t select * from t;

insert into t select * from t;

insert into t select * from t;

update t set object_id=rownum ;

commit;

create index idx_id_type on t(object_id,object_type);

create index idx_type_id on t(object_type,object_id);

set autotrace off

alter session set statistics_level=all ;

set linesize 366


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

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

-----------------------------------------------------------------------------------------------------

| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |

-----------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 5 |

| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 57 | 1 |00:00:00.01 | 5 |

|* 2 | INDEX RANGE SCAN | IDX_ID_TYPE | 1 | 9 | 1 |00:00:00.01 | 4 |

-----------------------------------------------------------------------------------------------------


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

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

Plan hash value: 3420768628


-----------------------------------------------------------------------------------------------------

| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |

-----------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 5 |

| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 57 | 1 |00:00:00.01 | 5 |

|* 2 | INDEX RANGE SCAN | IDX_TYPE_ID | 1 | 9 | 1 |00:00:00.01 | 4 |

-----------------------------------------------------------------------------------------------------



--4.组合索引最佳顺序一般是将列等值查询的列置前。(测试组合索引在条件是不等的情况下的情况,条件经常是不等的,要放在后面,让等值的在前面)


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

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

-----------------------------------------------------------------------------------------------------

| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |

-----------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | | 469 |00:00:00.01 | 86 |

| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 14 | 469 |00:00:00.01 | 86 |

|* 2 | INDEX RANGE SCAN | IDX_ID_TYPE | 1 | 1 | 469 |00:00:00.01 | 40 |

-----------------------------------------------------------------------------------------------------





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

-----------------------------------------------------------------------------------------------------

| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |

-----------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | | 469 |00:00:00.01 | 81 |

| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 469 | 469 |00:00:00.01 | 81 |

|* 2 | INDEX RANGE SCAN | IDX_TYPE_ID | 1 | 469 | 469 |00:00:00.01 | 35 |

-----------------------------------------------------------------------------------------------------





--5.注意组合索引与组合条件中关于IN 的优化(将会在案例部分描述,展现结果就不在这里贴出了)


--案例1


UPDATE t SET OBJECT_ID=20 WHERE ROWNUM<=26000;

UPDATE t SET OBJECT_ID=21 WHERE OBJECT_ID<>20;

COMMIT;

set linesize 1000

set pagesize 1

alter session set statistics_level=all ;

select /*+index(t,idx1_object_id)*/ * from t where object_TYPE='TABLE' AND OBJECT_ID >= 20 AND OBJECT_ID<= 21;



--6.案例2

--依然是关于IN的优化 (col1,col2,col3的索引情况,如果没有为COL2赋予查询条件时,COL3只能起到检验作用)


drop table t purge;

create table t as select * from dba_objects;

UPDATE t SET OBJECT_ID=20 WHERE ROWNUM<=26000;

UPDATE t SET OBJECT_ID=21 WHERE OBJECT_ID<>20;

Update t set object_id=22 where rownum<=10000;

COMMIT;


create index idx_union on t(object_type,object_id,owner);

set autotrace off

alter session set statistics_level=all ;

set linesize 1000

select * from t where object_type='VIEW' and OWNER='LJB';

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

--这里就略去了展现结果,在案例中有描述。


select /*+INDEX(T,idx_union)*/ * from t T where object_type='VIEW' and OBJECT_ID IN (20,21,22) AND OWNER='LJB';

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





索引 组合 查询 情况 条件 案例 顺序 前缀 学历 收银员 硕士 结果 职业 还是 部分 收银 联合 合适 少之又少 作用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会 苏州找大状互联网科技有限公司 麻工互联网科技 互联网科技的发展 科技与互联网发展 西安互联网科技 迪茉互联网科技 北京互联网络科技有限公司 互联网科技缩写 山东吉时兔互联网科技有限公司 上海电发互联网科技有限公司 西藏七维空间互联网科技有限公司 深圳前海聚择互联网科技有限公司 企晟互联网信息科技有限公司 四川慕妮娅互联网科技有限公司 互联网科技实习生岗位 求路客互联网科技电话 数字互联网科技有限公司 杭州融税互联网科技有限公司 互联网领先科技成果宣传视频 互联网黑科技 互联网金融 科技 互联网科技ppt模板 互联网科技大会 西藏七维空间互联网科技有限公司 福州新华互联网科技学校 知乎 米聚互联网科技南京有限公司排面 深圳育鹏互联网科技有限公司招聘 云鲸互联网络科技有限公司 玉溪新华互联网科技怎么选
0