Oracle如何查询访问同一表的两个以上索引

先抛出两个问题

Q1:

如果有A、B、C三个字段,都可能作为查询条件,是建立多个复合索引好,还是建立三个单列的索引

Q2:

我在同一张表上建立了多个索引,为什么Oracle每次都选择一个,而不能同时利用多个索引呢?

关于第一个问题,这个问题之所以不好回答是因为和业务或者说和查询的模式有很大的关系。

主要来看看第二个问题

我在同一张表上建立了多个索引,为什么Oracle每次都选择一个,而不能同时利用多个索引呢?

Oracle只有在AND-EQUALINDEX HASH JOINBITMAP INDEX AND/OR这三种执行计划下,能对一张表的查询中使用多个索引

今天主要来说下AND-EQUAL这种执行方式

AND-EQUAL是一种基于RBO下的执行计划,将多个单列索引进行合并(Index Merge)输出查询结果。
同时and_equal可以通过Hints来进行强制,最少指定两个索引,最多指定5个,但是在Oracle10G之后几乎已经被废弃了,(主要是因为10G之后主要使用的是CBO,复合索引远远优于And-Equal)

简单地来说,就是在访问一张表的同时,同时可以走多个不同的index。

但是在Oracle10G之后,Oracle是基于统计信息来选择执行计划,And-Equal这种方式无法显示出统计信息的直方图(我也不知道是为啥,反正在CBO之下,应该是只能使用一个Index)

索引的根本意义是,通过走索引能够筛选掉尽可能多的rowid和选择到尽可能少的rowid,(如果index scan得到的rowid的数量很多,和全表的rowid差不多,那我index scan个屁,不如直接full table scan)

所以理论上,复合索引可以完美解决第一个问题

 

 

 

https://blog.csdn.net/wadekobe9/article/details/7738955

转载于:https://www.cnblogs.com/MoreDrinkHotWater/p/8819647.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值