oracle数据库目录讲解,Oracle目录详解

Oracle索引详解

索引在逻辑上物理上都独立于关联表中的数据,在任何时候都可以创建或删除索引,

而不会影响基表或其它索引。

l创建索引

CREATE INDEX索引名ON表名(字段1,字段2)

CREATE INDEX rt_user_sys ON

IMS_RT_MANAGEDUSER_SYSTEM (SYSTEM_ID,MANAGEDUSER_ID)

l查看某个表中的索引

select * from all_indexes where table_name = 'IMS_RT_MANAGEDUSER_SYSTEM'

l删除索引

drop index idxname

注:索引是不可更改的,想更改必须删除重新建。

唯一索引、组合索引、反向键索引、位图索引和基于函数的索引:

l唯一索引:

此索引可以确保在定义索引的列中,表的任意两行的值都不相同。

Oracle自动为表的主键列创建唯一索引。

可以使用Create UNIQUE INDEX命令明确地创建唯一索引。

示例14:在itemfile表的itemcode列上创建了一个名为item_index的唯一索引。

Create UNIQUE INDEX item_index ON itemfile(itemcode);

l组合索引:

组合索引是在表中的多个列上创建的索引。组合索引中列的顺序是任意的,不必是表中相邻的列。

创建组合索引时,应注意定义中使用的列的顺序。通常,最频繁访问的列应放置在列表的最前面。

示例15:在itemfile表上创建了一个名为comp_index的组合索引,

当查询该表的的WHERE子句同时包含这两个列或只包含p_category列时,

以下示例语句创建的索引将用于检索数据,但如果单独使用itemrate列,则索引不能用于检索数据。

Create INDEX comp_index ON itemfile(p_category,itemrate);

l反向键索引:

通常建立在一些值连续增长的列上,例如列中的值是是由序列产生的情况。

示例16:在itemfile表上创建了一个名为rev_index的反向键索引。注意使用REVERSE关键字。

Create INDEX rev_index ON itemfile(itemcode) REVERSE;

示例17:使用关键字NOREVERSE可以将反向键索引重建为标准索引。

ALTER INDEX rev_index REBUILD NOREVERSE;

注意:不能将标准索引重建为反向键索引。

l位图索引:

如果某个列的值重复超过一百次,则可以考虑在该列上创建位图索引。

示例18:itemcode是order_detail表中的低基数列,因为货物编码在大多数订单中都是重复的,

因此适合在该列上创建位图索引。

Create BITMAP INDEX bit_ind1 ON order_detail(itemcode);

位图索引不应当用在频繁发生的INSERT,UPDATE,DELETE操作的表上。位图索引最适合于数据仓库和决策支持系统。

l索引组织表:

索引组织表与在一个或多个列上建立索引的普通表相似,但它无需为表和索引维护两个

单独的存储空间,数据库系统仅维护一个索引,该索引包含相应的已编码键值和与其关联的列值。

示例19:使用ORGANIZATION INDEX子句来创建索引组织表。

Create table ind_org_tab

(

vencode NUMBER(4) primary key,注意:primary key是创建索引组织表所必需的。不允许使用分区。

venname VARCHAR2(20)

)

organization index;

索引组织表适合于通过主键来访问数据。

l基于函数的索引:

如果在WHERE子句的算术表达式或函数中已经包含了某个列,则不会使用该列上的索引。

不能在表达式包含任何聚合函数,LOB列、REF列或包含LOB或REF的对象类型上创建基于函数的索引。

示例20:venname是vendor_master表的一个列,用于存储供应商的姓名,

假定所有供应商的姓名都以混合大小写的形式存储(如:John Smith、Dave Jones、Tony Greig等等),

同时假定我们经常需要根据供应商的姓名来查询表的数据。由于姓名是以混合大小写的形式存储的,

因此可能很难给出姓名的正确大小写形式。可以创建如下索引:

Create INDEX vn_ind ON vendor_master(UPPER(venname));

示例21:演示如何使用前面创建的基于函数的索引检索数据。

select * from vendor_master where UPPER(venname)='SMALL';

要创建基于函数或表达式的索引,必须具有QUERY REWRITE系统权限。

l索引中的分区:

与对表进行分区类似,Oracle也允许对索引分区。牵引分区可以存储在不同的表空间中。

局部分区索引:Oracle为表的每个分区建立一个独立的索引。

示例22:先创建分区表

Create table order_mast

(

orderno number(4),

venname varchar2(20)

)

partition by range(orderno)

(

partition oe1 values less than(1000),

partition oe2 values less than(2000),

partition oe3 values less than(maxvalue)

);

接着创建局部索引:

create INDEX myind ON order_mast(orderno) LOCAL;

全局分区索引:是指在分区表或非分区表上创建的索引。

示例23:在上面创建的分区表上创建全局索引

create INDEX glb_ind ON order_mast(orderno) GLOBAL

partition by range(orderno)

(

partition ip1 values less than(1500),

partition ip2 values less than(maxvalue)

);

在有3个分区的表上创建2个分区的索引。注意:不能在散列分区或子分区建立全局索引。

全局非分区索引:全局分区索引是在分区表上创建的全局索引,它类似于非分区表上的索引,

索引的结构不会被分割。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值