WEB开发网
开发学院数据库Oracle Oracle中建立索引并强制优化器使用 阅读

Oracle中建立索引并强制优化器使用

 2007-05-06 12:07:34 来源:WEB开发网   
核心提示: 值得庆幸的是,如果在这种情况下想要强制使用索引,Oracle中建立索引并强制优化器使用(2),有一种简便的方法:只要在WHERE 子句中增加一个或多个特定的条件,用于测试索引值,因为需要大小写字符所有可能的组合-joh ,Joh,jOh,joH等等,除此之外,并减少需要扫描的行,但这并没有

值得庆幸的是,如果在这种情况下想要强制使用索引,有一种简便的方法:只要在WHERE 子句中增加一个或多个特定的条件,用于测试索引值,并减少需要扫描的行,但这并没有修改原来SQL 编码中的条件。以下列查询语句为例:

SQL> select address from address where upper(name) like 'JO%' AND (name
like 'J%' or name like 'j%');

使用这种查询语句(已设置AUTOTRACE),可得到下列结果:

ADDRESS
cleveland
1 row selected.
Execution Plan
SELECT STATEMENT
CONCATENATION
TABLE ACCESS BY INDEX ROWID ADDRESS
INDEX RANGE SCAN ADDRESS_I
TABLE ACCESS BY INDEX ROWID ADDRESS
INDEX RANGE SCAN ADDRESS_I

现在,优化器为WHERE 子句中AND 联结的两个语句中每一个语句确定的范围进行扫描----第二个语句没有引用函数,因而使用了索引。在两个范围扫描后,将运行结果合并。

在这个例子中,如果数据库有成百上千行,可以用下列方法扩充WHERE 子句,进一步缩小扫描范围:

select address from address where
upper(name) like 'JOHN' AND (name like 'JO%'
or name like 'jo%' or name like 'Jo' or name like 'jO' );

得到的结果与以前相同,但是,其执行过程如下所示,表明有4个扫描范围。

Execution Plan
SELECT STATEMENT
CONCATENATION
TABLE ACCESS BY INDEX ROWID ADDRESS
INDEX RANGE SCAN ADDRESS_I
TABLE ACCESS BY INDEX ROWID ADDRESS
INDEX RANGE SCAN ADDRESS_I
TABLE ACCESS BY INDEX ROWID ADDRESS
INDEX RANGE SCAN ADDRESS_I
TABLE ACCESS BY INDEX ROWID ADDRESS
INDEX RANGE SCAN ADDRESS_I

如果试图进一步提高查询速度,我们可以在特定的“name like”条件中指明3个或更多的字符。然而,这样做会使得WHERE子句十分笨重。因为需要大小写字符所有可能的组合-joh ,Joh,jOh,joH等等。除此之外,指定一个或两个字符已足以加快查询的运行速度了。

Tags:Oracle 建立 索引

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接