oracle 性能优化操作九: 屏蔽无用索引

继续“oracle 性能优化操作八”的例子

由于实际查询中,还有涉及到DisposalCourseFlag=6的查询,而此时如果用上该字段上的索引,将是非常不明智的,效率也极低。

因此这种情况下,我们需要用特殊的方法屏蔽该索引,以便ORACLE选择其他字段上的索引。

比如,如果字段为数值型的就在表达式的字段名后,添加“+ 0”,为字符型的就并上空串:||""

如:

select * from  serviceinfo where DisposalCourseFlag+ 0 = 6 and workNo =  '36' ;

不过,不要把该用的索引屏蔽掉了,否则同样会产生低效率的全表扫描。

时间: 2024-10-09 23:35:41

oracle 性能优化操作九: 屏蔽无用索引的相关文章

oracle 性能优化操作八: 利用HINT强制指定索引

在ORACLE优化器无法用上合理索引的情况下,利用HINT强制指定索引. 继续"oracle 性能优化操作七"的例子,ORACLE缺省认定,表中列的值是在所有数据行中均匀分布的, 也就是说,在一百万数据量下,每种DisposalCourseFlag值各有12.5万数据行与之对应. 假设SQL搜索条件DisposalCourseFlag=2,利用DisposalCourseFlag列上的索引进行数据搜索效率, 往往不比全表扫描的高,ORACLE因此对索引"视而不见",

oracle 性能优化操作:总结

oracle性能优化操作的这几篇文章,是完全可以相互结合同时运用的.而且各种方法之间相互影响,紧密联系. 这种联系既存在一致性,也可能带来冲突,当冲突发生时,需要根据实际情况进行选择,没有固定的模式. 最后决定SQL优化功力的因素就是对ORACLE基础的掌握程度了. 另外,值得注意的是:随着时间的推移和数据的累计与变化,ORACLE对SQL语句的执行计划也会改变. 比如:基于代价的优化方法,随着数据量的增大,优化器可能错误的不选择索引而采用全表扫描. 这种情况可能是因为统计信息已经过时,在数据量

oracle 性能优化操作五:尽量去掉 "<>"

尽量去掉 "<>",避免全表扫描,如果数据是枚举值,且取值范围固定,则修改为"OR"方式. 例: <span style="font-size:18px;">UPDATE SERVICEINFO SET STATE=0 WHERE STATE<>0;</span> 以上语句由于其中包含了"<>",执行计划中用了全表扫描(TABLE ACCESS FULL),没有用到s

Oracle性能分析8:创建索引

在创建索引时,我们往往希望能够预估索引大小,以评估对现有工程环境的影响,我们也希望创建索引的过程能够最小化的影响我们正在运行的工程环境,并能查看索引的状况. 预估索引大小 预估索引大小,最好的办法是在测试环境中创建它,测试环境最好包含完整的工程环境数据,否则只有通过部分数据来推算完整的索引大小. 如果不能搭建测试环境,Oracle提供了存储过程DBMS_SPACE.CREATE_INDEX_COST来估算索引的大小,下面是一个例子: declare used_bytes number(10);

Oracle性能分析7:创建索引

在创建索引时,我们往往希望可以预估索引大小,以评估对现有project环境的影响,我们也希望创建索引的过程可以最小化的影响我们正在执行的project环境,并能查看索引的状况. 预估索引大小 预估索引大小,最好的办法是在測试环境中创建它,測试环境最好包括完整的project环境数据,否则仅仅有通过部分数据来推算完整的索引大小. 假设不能搭建測试环境,Oracle提供了存储过程DBMS_SPACE.CREATE_INDEX_COST来估算索引的大小,以下是一个样例: declare used_by

oracle 性能优化操作十五: 基于函数的索引要求等式匹配

前几篇博客例子中,我们创建了基于函数的索引,但是如果执行下面的查询: <span style="font-size:18px;">select * from emp where substr(ename,1,1)='S';</span> 得到的执行计划将还是(TABLE ACCESS FULL),因为只有当数据列能够等式匹配时,基于函数的索引才能生效, 这样对于这种索引的计划和维护的要求都很高.请注意,向表中添加索引是非常危险的操作,因为这将导致许多查询执行计划

oracle 性能优化操作十六: 使用分区索引

在用分析命令对分区索引进行分析时,每一个分区的数据值的范围信息会放入Oracle的数据字典中. Oracle可以利用这个信息来提取出那些只与SQL查询相关的数据分区. 例如,假设你已经定义了一个分区索引,并且某个SQL语句需要在一个索引分区中进行一次索引扫描. Oracle会仅仅访问这个索引分区,而且会在这个分区上调用一个此索引范围的快速全扫描. 因为不需要访问整个索引,所以提高了查询的速度.

oracle 性能优化操作十四: 使用基于函数的索引

前面谈到任何对列的操作都可能导致全表扫描,例如: <span style="font-size:18px;">select * from emp where substr(ename,1,2)='SM';</span> 但是这种查询又经常使用,我们可以创建一个带有substr函数的基于函数的索引, <span style="font-size:18px;">create index emp_ename_substr on eemp

oracle 性能优化操作十八: 决定使用全表扫描还是使用索引

和所有的秘笈一样,最后一招都会又回到起点,最后我们来讨论一下是否需要建立索引,也许进行全表扫描更快. 在大多数情况下,全表扫描可能会导致更多的物理磁盘输入输出,但是全表扫描有时又可能会因为高度并行化的存在而执行的更快. 如果查询的表完全没有顺序,那么一个要返回记录数小于10%的查询可能会读取表中大部分的数据块,这样使用索引会使查询效率提高很多. 但是如果表非常有顺序,那么如果查询的记录数大于40%时,可能使用全表扫描更快. 因此,有一个索引范围扫描的总体原则是: 1)对于原始排序的表  仅读取少