首页 > Oracle > Oracle 如何让指定sql走指定的索引,让索引只能被指定的sql引用!
2014
05-19

Oracle 如何让指定sql走指定的索引,让索引只能被指定的sql引用!

要创建一个索引,去优化一个SQL,但是创建了索引之后其他 SQL 也要可能也会用到这个索引,其他SQL也许会变得很慢,但是需要优化的SQL又快。遇到这种问题怎么办?一般遇到这种问题还是很少的。处理的方法很多。我简单的给大家介绍一种方法。

因为这个索引是单独为了这一个sql创建的,其他sql不引用这个索引,网上有方法说把索引的集群因子弄大,手工设置索引的统计信息,让其CBO都不选择这个索引,这样难免会比较繁琐,这里给大家介绍一种更简单的办法,在Oracle11g以上,Oracle提供了一种不可见索引。下面我们来看例子:

1. 创建test表,创建一般的B树索引

2. 查询sql,查看执行计划

3. 毫无疑问,这里的sql会通过索引扫描来访问表数据,下面我们创建不可见的索引,首先删除这个索引。

4. 可以看到我这里创建的不可见索引,sql没有通过索引来扫描,而是通过全表扫描来提取数据,这种不可见索引对所有的sql都是隐藏的,下面我们通过hint来执行这个sql通过索引来提取数据,首先需要设置一个隐藏参数,否则还是无法指定不可见索引

5. 上面为不见索引的一个妙用,还有一个就是当我们确定不使用某个索引时,可以将其设置为不可见,特别是对于大表,如果之后我们确定需要再次使用该索引时,我们可以将其设置为可见即可。当然了,如果确实不需要使用,将其删除是最好的。对索引设置为可见,很简单,如下:

6. 此时无需指定sql使用这个索引,因为索引可见了,CBO会自动选择是否使用这个索引。用不可见索引来测试索引的可行性,还有就是sql特定的sql,还是比较有用的。因为不可见索引也会随表的DML更新。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL