首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL/Oracle:当可以对多个列使用索引时

SQL/Oracle:当可以对多个列使用索引时
EN

Stack Overflow用户
提问于 2008-09-11 23:09:47
回答 2查看 35.9K关注 0票数 20

如果我按这个顺序在列(A,B,C)上创建索引,我的理解是,即使我只在(A)、(A和B)或(A和B和C)上搜索,数据库也可以使用它,但如果我只在(B)、(C)或(B和C)上搜索,数据库就不能使用它。这是正确的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

我最常看到的是“在野外”的快速全索引扫描,但一切都是可能的。

票数 14
EN

Stack Overflow用户

发布于 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)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档