读《数据库索引设计与优化》以及相关知识

一.优化器的优化方式

Oracle的优化器共有两种的优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO)。

1.RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。

2.CBO方式:依词义可知,它是看语句的代价(Cost)了,这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小 、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是你在做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因此我们应及时更新这些信息。在Oracle8及以后的版本,Oracle列推荐用CBO的方式。

优化模式包括Rule,Choose,First rows,All rows这四种方式。其中默认使用的是Choose方式,指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。

二.注意避免使用困难谓词

困难谓词就是对于优化器难以优化的谓词,他可能会导致执行sql语句的时候并没有执行你所期望的执行计划(索引)。所以这些谓词又被称为不可索引化(nonindexable)

这里补充一下哪些常见情况下是不走索引的:

1、建立组合索引,但查询谓词并未使用组合索引的第一列。

2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。

3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。

4、当被索引的列进行隐式的类型转换时不会使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但类型是字符型,这时Oracle会产生隐式的类型转换,转换后的语句类似于select * from t where to_number(indexed_column) = 5

6、使用 <>

8、not in ,not exist.

下面介绍几种困难谓词的情况:

1、使用Like的情况,如果值是‘%xx’,那么会通过Index Full scan查询,如果值是’xx%’,则会通过Index Range scan查询。

2、or操作符和布尔谓词(A>:A or B>:B):我么考虑如果是and的情况,那么识别索引片A的时候,如果B索引片不符合,则可以直接忽略。但是如果是or则不能,所以可能会不走索引,最后看到的执行计划是Index Full scan或者Full table scan

    原文作者:吉祥如意酥
    原文地址: https://www.jianshu.com/p/1c03e11695ab
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞