先抛出两个问题
Q1:
如果有A、B、C三个字段,都可能作为查询条件,是建立多个复合索引好,还是建立三个单列的索引Q2:
我在同一张表上建立了多个索引,为什么Oracle每次都选择一个,而不能同时利用多个索引呢?关于第一个问题,这个问题之所以不好回答是因为和业务或者说和查询的模式有很大的关系。
主要来看看第二个问题
我在同一张表上建立了多个索引,为什么Oracle每次都选择一个,而不能同时利用多个索引呢?Oracle只有在AND-EQUAL、INDEX HASH JOIN和BITMAP 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