当前位置:  开发笔记 > 编程语言 > 正文

SQL/Oracle:可以使用多列上的索引

如何解决《SQL/Oracle:可以使用多列上的索引》经验,为你挑选了2个好方法。

如果我按照这个顺序在列(A,B,C)上创建一个索引,我的理解是,即使我只搜索(A),或(A和B),或者(只搜索),数据库也可以使用它. A和B和C),但如果我只搜索(B),或(C),或(B和C),则不会.它是否正确?



1> David Aldrid..:

实际上,当谓词放在索引的非前导列上时,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

我经常看到"在野外"的快速全指数扫描,但一切都是可能的.



2> Ethan Post..:

这是不正确的.总是最好提出一个代表您的数据的测试用例并亲自查看.如果你想真正了解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)

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有