如果我按这个顺序在列(A,B,C)上创建索引,我的理解是,即使我只在(A)、(A和B)或(A和B和C)上搜索,数据库也可以使用它,但如果我只在(B)、(C)或(B和C)上搜索,数据库就不能使用它。这是正确的吗?
发布于 2008-09-15 20:25:05
当谓词放在索引的非前导列上时,Oracle实际上可以使用三种基于索引的访问方法。
i)索引跳过扫描:http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#PFGRF10105
ii)快速全索引扫描:http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i52044
iii)索引全扫描:http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i82107
我最常看到的是“在野外”的快速全索引扫描,但一切都是可能的。
发布于 2008-09-12 15:47:59
这是不正确的。最好是拿出一个测试用例来代表你的数据,然后自己去看看。如果你想真正了解Oracle SQL Optimizer google Jonathan Lewis,请阅读他的书,阅读他的博客,查看他的网站,这家伙很棒,他总是生成测试用例。
create table mytab nologging as (
select mod(rownum, 3) x, rownum y, mod(rownum, 3) z from all_objects, (select 'x' from user_tables where rownum < 4)
);
create index i on mytab (x, y, z);
exec dbms_stats.gather_table_stats(ownname=>'DBADMIN',tabname=>'MYTAB', cascade=>true);
set autot trace exp
select * from mytab where y=5000;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=10)
1 0 INDEX (SKIP SCAN) OF 'I' (INDEX) (Cost=1 Card=1 Bytes=10)
https://stackoverflow.com/questions/57878
复制相似问题