Where city is null
Where city is not null
Where city!= ‘jilin’
5
) 对索引主列的行有限定条件,但条件在表达式里使用。例如,如果在
City 列上索引,那
么限定条件
Where City = ‘jilin’
可以使用索引。然而,如果限定条件是
Where UPPER(City)=’liaoning’
那么不会使用 City 列上的索引,因为 City 列在 UPPER 函数里。如果将 City 列与文本字符串
联结在一起,也不会使用索引。例如,如果限定条件是
Where City||’x’ like ‘jilin%’
那么不会使用
City 列上的索引。
6
) 对索引主列的行有限定条件,但条件使用
Like
‘ ’
操作以及值以 % 开始或者值是一个赋
值变量。例如,在所有下列情况下都不会使用索引:
Where City like ‘%aonin%’
Where City like :City_Bind_Variable
如果表小、索引列无选择性,基于开销的优化器可能决定使用全表扫描。
2.2 只使用选择性索引
索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有 1000 个记录,表索
引列有
950 个不同值,那么这个索引的选择性就是 950/1000 或者 0.95。最好的可能性选择是
1.0。依据非空值列的唯一索引,通常其选择性为 1.0。
如果使用基于开销的最优化,优化器不应该使用选择性不好的索引。
索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有 1000 个记录,表索
引列有
950 个不同值,那么这个索引的选择性就是 950/1000 或者 0.95。最好的可能性选择是
1.0。依据非空值列的唯一索引,通常其选择性为 1.0。
2.3 管理多表联结
Oracle 提供了 3 个联结操作:NESTED LOOPS、HASH JOIN 和 MERGE JOIN。MERGE
JOIN 是一组操作,在所有行被处理完之前,它不返任何记录给下一操作。NESTED LOOPS 和
HASH JOIN 是行操作,因此会很快将第一批记录返回给下一个操作。
在每个联结选项里,必须执行一些步骤以获取最好的联结性能。如果没有适当地优化联结操
作,那么联结所需的时间也许随着表的增长而呈指数级地增长。
2.4 管理包含视图的 SQL 语句
如果查询包含视图,优化器有两种执行查询的方法:首先解决视图然后执行查询,或者把视
图文本集成到查询里去。如果首先执行视图,那么首先完成全部的结果集,然后用其余的查询条
件做过滤器。
首先解决视图会导致查询性能下降的问题,这取决于所涉及表的相对大小。如果视图被集成到
查询里,那么查询的条件也可以应用于视图里,并且可以使用一个小一些的结果集。然而在一些
情况下,也许可以通过视图分离组操作提高查询性能。
如果一个视图包含集合的操作(如 Group by、SUM、COUNT 或者 DISTINCT),那么视图不
能被集成到查询里去。不使用组或者没有集合操作的视图的
SQL 语法可以被集成到大的查询里去。