background image

    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只使用选择性索引

     索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有 1000 个记录,表索
引列有

950 个不同值,那么这个索引的选择性就是 950/1000 或者 0.95。最好的可能性选择是

1.0。依据非空值列的唯一索引,通常其选择性为 1.0。
     如果使用基于开销的最优化,优化器不应该使用选择性不好的索引。
     索引的选择性是指索引列里不同值的数目与表中记录数的比。如果表有 1000 个记录,表索
引列有

950 个不同值,那么这个索引的选择性就是 950/1000 或者 0.95。最好的可能性选择是

1.0。依据非空值列的唯一索引,通常其选择性为 1.0。

2管理多表联结

     Oracle 提供了 3 个联结操作:NESTED LOOPS、HASH JOIN 和 MERGE JOIN。MERGE 
JOIN 是一组操作,在所有行被处理完之前,它不返任何记录给下一操作。NESTED LOOPS 和
HASH JOIN 是行操作,因此会很快将第一批记录返回给下一个操作。
     在每个联结选项里,必须执行一些步骤以获取最好的联结性能。如果没有适当地优化联结操
作,那么联结所需的时间也许随着表的增长而呈指数级地增长。

2管理包含视图的 SQL 语句

    如果查询包含视图,优化器有两种执行查询的方法:首先解决视图然后执行查询,或者把视
图文本集成到查询里去。如果首先执行视图,那么首先完成全部的结果集,然后用其余的查询条
件做过滤器。
    首先解决视图会导致查询性能下降的问题,这取决于所涉及表的相对大小。如果视图被集成到
查询里,那么查询的条件也可以应用于视图里,并且可以使用一个小一些的结果集。然而在一些
情况下,也许可以通过视图分离组操作提高查询性能。
    如果一个视图包含集合的操作(如 Group by、SUM、COUNT 或者 DISTINCT),那么视图不
能被集成到查询里去。不使用组或者没有集合操作的视图的

SQL 语法可以被集成到大的查询里去。