|
看到一则oracle优化的例子,关于<>的,但不理解为何
平常用<>都是直接用 “字段<>值”的方式的,但看到奇怪的用法确是:“字段<值 or 字段>值”这样的方式
而且前者能用不到索引,而后者确用到了。这个是<>的特殊用法还是什么呢?
--测试数据
--创建大表
create table big_table
as
select rownum id, a.*
from all_objects a
where 1=0
/
alter table big_table nologging;
declare
l_cnt number;
l_rows number := &1;
begin
insert /*+ append */
into big_table
select rownum, a.*
from all_objects a
where rownum <= &1;
l_cnt := sql%rowcount;
commit;
while (l_cnt < l_rows)
loop
insert /*+ APPEND */ into big_table
select rownum+l_cnt,
OWNER, OBJECT_NAME, SUBOBJECT_NAME,
OBJECT_ID, DATA_OBJECT_ID,
OBJECT_TYPE, CREATED, LAST_DDL_TIME,
TIMESTAMP, STATUS, TEMPORARY,
GENERATED, SECONDARY
from big_table
where rownum <= l_rows-l_cnt;
l_cnt := l_cnt + sql%rowcount;
commit;
end loop;
end;
/
alter table big_table add constraint
big_table_pk primary key(id)
/
select count(*) from big_table;
/*
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0
Connected as scott
SQL>
Table created
Table altered
PL/SQL procedure successfully completed
Table altered
COUNT(*)
----------
100000
SQL>
*/
select * from big_table where id<>100000;
--Explain Plan(全表扫描)
/*
SELECT STATEMENT, GOAL = CHOOSE 0
TABLE ACCESS FULL 1 FULL SCOTT BIG_TABLE
*/
select * from big_table where id<100000 or id>100000;
--Explain Plan(使用索引)
/*
SELECT STATEMENT, GOAL = CHOOSE 0
CONCATENATION 1
TABLE ACCESS BY INDEX ROWID 2 BY INDEX ROWID SCOTT BIG_TABLE
INDEX RANGE SCAN 3 RANGE SCAN SCOTT BIG_TABLE_PK
TABLE ACCESS BY INDEX ROWID 4 BY INDEX ROWID SCOTT BIG_TABLE
INDEX RANGE SCAN 5 RANGE SCAN SCOTT BIG_TABLE_PK
*/ |
|