文档库 最新最全的文档下载
当前位置:文档库 › Oracle DB 索引

Oracle DB 索引

Oracle DB 索引
Oracle DB 索引

索引是数据库对象,可以通过创建索引来提高一些查询的性能。在你创建主键或唯一约束条件时,服务器会同时自动创建索引。

?索引

索引具有以下特点:

?是一个方案对象

? Oracle Server 可用来通过指针加快行检索速度

?可通过使用快速路径访问方法迅速找到数据来减少磁盘的输入/ 输出(I/O)

?与建立索引的表无关

?由Oracle Server 自动使用和维护

Oracle Server 索引是一个方案对象,可以通过指针加快行检索速度。可以显式创建索引,也可以自动创建索引。如果没有在列上建立索引,则会对整个表进行扫描。

使用索引可以直接而快速的访问表中的行。其作用是通过使用索引路径快速找到数据来减少磁盘的I/O。索引由Oracle Server 自动使用和维护。创建索引之后,就不需要用户直接执行任何操作了。

索引是与表关联的可选结构。创建索引可提高更新和检索数据的性能。Oracle 索引提供了到数据行的直接访问路径。

可以对表的一个或多个列创建索引。创建索引后,Oracle 服务器会自动维护和使用索引。表数据的更新(如添加新行、更新行或删除行)会自动传播到所有相关的索引,这些对用户来说是完全透明的。

索引在逻辑上和实际上都独立于建立索引的表。这意味着可以在任何时候创建或删除索引,而不会对基表或其它索引产生任何影响。

注:在删除表时,会另外删除相应的索引。

?索引类型

可以根据需要使用几种类型的索引结构:

? B 树索引采用二进制树的形式,它是默认的索引类型。

?在位图索引中,每个建立索引的独特值都有一个位图,每一位的位置都表示一行,其中可能包含(也可能不包含)索引值。对于低基数列而言,这是最佳结构。

下面是最常见的索引形式:

?B 树

?位图

B 树索引的键值存储在平衡树(B 树)中,以提供快速的二进制搜索。

在位图索引中,每个要建立索引的独特键值都有一个位图。在每一位图中,为要建立索引的表中的每一行都保留了一位。这样,独特值很少时可快速进行查找;也就是说,索引列的基数较低。性别指示器就是这种索引的一个示例。这种指示器只包含值“M ”和“F”,因此,只需要搜索两个位图。再举例说,如果对phone_number列使用位图索引,则需要管理和搜索太多的位图,这种情况下效率非常低。所以,请对低基数列使用位图索引。

B 树索引

B 树索引的结构

索引的顶层为根,它包含指向索引中下一层次的条目。下一层次为分支块,它又指向位于索引中下一层次的块。位于最低层次的是叶节点,它包含指向表行的索引条目。叶块在两个方向都是相互关联的,这便于按键值升序或降序扫描索引。

索引叶条目的格式

索引条目包括下列组成部分:

?条目头,用于存储列数和锁定信息。

?键列长度- 值对,用于定义键中的列大小,后面跟着列值(这种对的数目就是索引中的最大列数)。

?包含键值的行的ROWID。

索引叶条目的特性

在非分区表的B 树索引中:

?当多个行具有相同的键值时,如果不压缩索引,键值会出现重复。

?当某行包含的所有键列为NULL 时,该行没有对应的索引条目。因此,当WHERE子句指定了NULL 时,始终会导致全表扫描。

?因为所有行属于同一个段,所以要使用受限的ROWID指向表行。

对索引执行DML 操作的效果

对表执行DML 操作时,Oracle 服务器会维护所有索引。下面说明对索引执行DML 命令所产生的效果:

?执行插入操作会导致在相应块中插入索引条目。

?删除一行只会导致对索引条目进行逻辑删除。在删除块中的所有条目之前,已删除行占用的空间不可用于新条目。

?更新键列会导致对索引进行逻辑删除和插入。PCTFREE设置对索引没有影响,但创建时除外。即使索引块的空间少于PCTFREE指定的空间,也可以向索引块添加新条目。

位图索引

在以下特定情况下,位图索引比B 树索引更有优势:

?表具有数百万行且键列的基数较低时,也就是列的独特值极少时。例如,对于护照记录表中的性别和婚姻状况列,位图索引可能比B 树索引更可取。

?经常使用涉及OR运算符的多个WHERE条件组合进行查询时。

?键列上存在只读活动或较少更新活动时。

位图索引的结构

位图索引也可以按B 树形式进行组织,但是,叶节点会存储每个键值的位图,而不是

ROWID列表。位图中每一位都对应于一个可能的ROWID,如果已设置该位,则表示具有对应ROWID的行包含键值。

如图所示,位图索引的叶节点包含:

?条目头,其中包含列数和锁定信息

?由每个键列的长度-值对组成的键值。在本示例中,键只包含一列,第一个条目的键值为Blue 。

?开始ROWID,在本示例中它指定块号10、行号0 和文件号3。

?结束ROWID,在本示例中它指定块号12、行号8 和文件号3。

?由位字符串组成的位图段。(如果对应行包含键值,则会设置位;如果对应行不包含键值,则不会设置位。Oracle 服务器使用已获专利的压缩技术存储位图段。)

开始ROWID是位图中位图段指向的第一行ROWID,就是说,位图的第一个位对应于该ROWID,位图的第二个位对应于块中的下一行。结束ROWID是一个指针,它是指向由位图段覆盖的表中的最后一行。位图索引使用受限的ROWID。

使用位图索引

B 树用于定位叶节点,这些节点包含指定键值的位图段。开始ROWID和位图段用于定位包含键值的行。

更改了表中的键列后,也必须更改位图。这会导致相关的位图段处于锁定状态。由于锁是在整个位图段上获得的,因此,在第一个事务处理结束之前,位图覆盖的行不能由其它事务处理进行更新。

索引选项

?唯一索引可确保每个索引值是唯一的。

?索引可按升序或降序存储其键值。

?反向键索引以反向顺序存储其键值字节。

?组合索引是基于多列的索引。

?基于函数的索引是以函数返回值为基础的索引。

?在压缩的索引中重复的键值已被删除。

为了提高检索效率,在索引中按降序存储键可能更有益。这是根据最常用的数据访问方式得出的结论。

反向键索引会按反向顺序存储索引值的字节。这可以减少索引中特定热点的活动量。如果多个用户正按同一顺序处理数据,那么在任何给定时刻,(当前正在处理的)键值的前缀部分是很接近。因此,在索引结构的该区域中会发生大量的活动。为反向字节样式的键值建立索引后,反向键索引会将这些活动分布到整个索引结构中。

按多列组合创建的索引称为组合索引。例如,根据一个人的姓与名可创建一个索引:

CREATE INDEX name_ix ON employees

(last_name, first_name);

使用基于函数的索引可为函数返回值创建索引。这个函数可以是一个内置SQL 函数、外部提供的PL/SQL 函数,或用户编写的函数。这样一来,服务器根据索引表达式执行搜索时,不必为每个键值调用函数。以下示例为返回的树木材积建立索引,树木材积由函数根据每一种树的树种、高度和树围(这些是TREES表中的列)进行计算:

CREATE INDEX tree_vol_ix ON

TREES(volume(species,height,circumference));

然后,WHERE子句中包含表达式volume(species,height,circumference) 的任何查询都能利用此索引,从而提高了执行速度,因为每一种树的材积已被计算出来。像普

通索引一样,基于函数的索引自动进行维护。

使用压缩索引可减少执行过程中占用的磁盘空间。由于删除了重复的键值,指定的磁盘空间量可以容纳更多的索引条目,因此,相同的时间段内可以从磁盘读取更多的条目。必须分别在写入索引和读取索引时执行压缩和解压缩。

?如何创建索引

?自动创建:如果在表定义中定义了PRIMARY KEY 或UNIQUE 约束条件,则会自动创建一个唯一的索引。

?手动创建:用户可以通过对列创建非唯一的索引来加快行访问速度。

可以创建两种类型的索引。

?唯一索引:如果你在表中定义的列具有PRIMARY KEY 或UNIQUE 约束条件,则Oracle Server 会自动创建此类型的索引。索引的名称和约束条件的名称相同。

?非唯一索引:这种类型的索引可以由用户创建。例如,可以通过在查询中为联接创建一个FOREIGN KEY 列索引来提高检索速度。

注:可以手动创建唯一索引,但是建议你创建唯一约束条件,这样可隐式创建唯一索引。

?创建索引

?对一个或多个列创建索引:

CREATE UNIUQE | BITMAP INDEX .

ON .

( | ASC | DESC,

| ASC | DESC,...)

TABLESPACE

STORAGE

LOGGING | NOLOGGING

COMPUTE STATISTICS

NOCOMPRESS | COMPRESS

NOSORT | REVERSE

PARTITION | GLOBAL PARTITION

相关说明

1)UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree 索引。

2) | ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引”

3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)

4)STORAGE:可进一步设置表空间的存储参数

5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING 来减少占用空间并提高效率)

6)COMPUTE STATISTICS:创建新索引时收集统计信息

7)NOCOMPRESS | COMPRESS:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)

8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值

9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区

指定UNIQUE 时指出单个或多个列的列值(索引所基于的)必须为唯一。指定BITMAP时指出会使用位图为每个不同的键创建索引,而不用是分别为每一行建立索引。建立位图索引时会将与键值关联的rowids 存储为位图。

?提高对EMPLOYEES 表中LAST_NAME 列的查询访问速度:

CREATE INDEX emp_last_name_idx ON employees(last_name);

也可以在“Administration(管理)”页的“Schema(方案)”标题下单击“Indexes(索引)”链接,以查看“Indexes(索引)”页。可查看索引属性,或使用“Actions(操作)”菜单查看索引的相关性。

根据对表设置的约束条件,可显式或隐式建立索引。定义主键就是隐式建立索引的一个示例,此时为了对列强制实施唯一性,会自动建立唯一索引。

索引创建准则

在以下情况下应创建索引:

列包含值的范围很广

列包含大量空值

在WHERE子句或联接条件中频繁使用一个或多个列

表很大,但是预计大多数查询要检索的行小于表中行数的2% 至4%

请勿在以下情况下创建索引:

这些列没有频繁用做查询中的条件

表比较小,或者预计大多数查询要检索的行超过表中行数的2% 至4%

表更新频繁

在表达式中已引用索引列

索引多未必会更好

并不是表索引越多查询速度越快。在具有索引的表上提交每项DML 操作后,都意味着必须更新相应的索引。与表关联的索引越多,在执行DML 操作之后,Oracle Server 为更新全部索引所做的工作就越多。

什么情况下要创建索引

因此,仅在以下情况下才应创建索引:

?列包含值的范围很广

?列包含大量的空值

?在WHERE子句或联接条件中频繁使用一个或多个列

?表很大,但是预计大多数查询要检索的行小于行数的2% 至4%

注意,如果要强制实现唯一性,则应在表定义中定义一个唯一约束条件。此时可以自动创建一个唯一索引。

删除索引

?使用DROP INDEX命令可从数据字典中删除索引:

DROP INDEX index ;

?从数据字典中删除emp_last_name_idx索引:

DROP INDEX em p_last_name_idx;

?要删除索引,必须是索引的所有者或拥有DROP ANY INDEX权限。

不能修改索引。要更改索引,必须先删除它,然后重新创建。

发出DROP INDEX语句后,可从数据字典中删除索引定义。要删除索引,必须是索引的所有者或拥有DROP ANY INDEX 权限。

在此语法中,index是索引的名称。

注:如果删除了一个表,则会自动删除索引和约束条件,但会保留视图和序列。

Oracle 索引组织表与标准表

Oracle 索引组织表与标准表 索引组织表也称为IOT ,索引组织表实际上一个表,不过它的存储结构不像普通的表那样采用堆组织方式,而是采用索引的组织方式。对于普通表而言,其存储结构是将记录无序地存放在数据段中,而索引化组织表是将记录按照某个主键列进行排序后,再以B 树的组织方式存放在数据段中。 由于整条记录都被保存在索引中,所以索引组织表不需要使用ROWID 来确定记录的位置。在索引组织表中只需要知道主键列的值,就能够直接找到相应记录的完整内容。因此,索引组织表提供了快速的、基于主键的对表中数据快速访问。但是,这是以牺牲插入和更新性能为代价的。图9-6所示示意性地列出了索引组织表与标准表之间的区别。 ROWID 普通表索引索引表 主键行头非主键列 图9-6 索引组织表与标准堆表的对比 对于普通表而言,表、索引数据是分别存放在表段、索引段,要占用更多空间;而对于索引表而言,主键列和非主键列的数据都被存放在主键索引段中。当经常要使用主键列定义表数据时,应该建立索引表。使用索引表,一方面降低了磁盘和内存空间占用。另一方面也可以提高访问性能。 建立索引表也是使用CREATE TABLE 语句完成的。需要注意,建立索引组织表时,必须指定ORGANIZATION INDEX 关键字,并且在索引组织表中必须定义主键约束。例如,下面的语句建立一个索引组织的EMPLOYEES 表: SQL> create table employees( 2 empno number(5) primary key, 3 ename varchar2(15) not null, 4 job varchar2(10), 5 hiredate date default (sysdate), 6 sal number(7,2), 7 deptno number(3) not null 8 ) organization index 9 tablespace users; 表已创建。

Oracle索引分析与查询优化

龙源期刊网 https://www.wendangku.net/doc/6b4247401.html, Oracle索引分析与查询优化 作者:崔黎明志远李婧 来源:《数字技术与应用》2016年第07期 摘要:Oracle是目前国内在大型数据存储中用得比较多的一种关系型数据库,磁盘阵列技术(RAID)和集群技术(RAC)的运用,使Oracle在处理数据效率和数据安全上有非常大的提高,在国内交通、电力,通信和金融等重要领域都有广泛的用途。本文基于Oracle 11g版本,对Rowid和索引的原理机制做出分析,并论述利用这些原理对大型数据表查询的优化。 关键词:Oracle Rowid 索引查询 中图分类号:TP311.13 文献标识码:A 文章编号:1007-9416(2016)07-0234-02 在逻辑上,Oracle是由多个表空间构成的,在新建一个表空间的时候,必须指定存储的文件,可以指向多个存储在不同磁盘上的数据。表空间下面分为段、区、块。新建一张表的时候,Oracle数据库就会为它创建一个段。所谓区就是指连续的块(block)构成的空间,一般区包含8个空块,block是Oracle数据库最小的数据空间,一般为8k或16k,当开始往这个表中插入数据的时候,Oralce数据库会自动为这个表分配一个区,并把数据不断往此区进行填充,当数据填满此区后,Oralce数据库会重新为该表分配一个区而不是一个段。实际上,对于我们不同的查询过程中,就是通过一些谓词过滤条件,从对应的数据块中获取正确的一行数据或多行数据。如何快速定位到该数据行,是一个数据库学习者不断探索的方向。 1 Rowid 1.1 简介 从字面上理解是行标识的意思,它是Oracle数据库中数据表的一个伪列,用于存放该表中每一行数据的地址,在8i版本之前,Oracle采用受限制的rowid,它是由数据文件编号,块编号和数据在该块内的偏移量这三个部分构成,长度为6个字节,因此在8i之前的版本中,每 个数据库最多可以包含1022个文件,每个文件最多能有4m个数据块,而每个数据库最多能 存储64k条记录。为了突破长度的限制和解决其他一些缺陷,Oracle数据库引入了这样一个概念:相对文件号。它的主要特点是改变之前rowid中数据文件编号是整个数据库范围组成的表空间,即文件编号为5的文件不再是数据库中编号为5的数据文件,而是表空间中对应编号的数据文件。如下图1所示为Oracle11g中一个普通表的rowid。 从该图1中可以看到rowid共有18位,分为四部分,格式为:AAAAAABBBCCCCCCDDD,其中AAAAAA六位表示dataobjectid,根据这个id可以确定该行数据在哪个段中;BBB三位表示相对文件号,通过这个字段号可以用来确定该行数据的绝 对文件号;CCCCCC六位表示datablocknumber,它是相对于datafile的编号;最后三位DDD

oracle索引基本分类

oracle索引基本分类法分类 逻辑上: Single column 单行索引 Concatenated 多行索引 Unique 唯一索引 NonUnique 非唯一索引 Function-based函数索引 Domain 域索引 物理上: Partitioned 分区索引 NonPartitioned 非分区索引 B-tree: Normal 正常型B树 Rever Key 反转型B树 Bitmap 位图索引 索引结构: B-tree: 适合与大量的增、删、改(OLTP); 不能用包含OR操作符的查询; 适合高基数的列(唯一值多) 典型的树状结构; 每个结点都是数据块; 大多都是物理上一层、两层或三层不定,逻辑上三层; 叶子块数据是排序的,从左向右递增; 在分支块和根块中放的是索引的范围; Bitmap: 适合与决策支持系统; 做UPDATE代价非常高; 非常适合OR操作符的查询; 基数比较少的时候才能建位图索引; 树型结构: 索引头 开始ROWID,结束ROWID(先列出索引的最大范围) BITMAP 每一个BIT对应着一个ROWID,它的值是1还是0,如果是1,表示着BIT 对应的ROWID有值; =============================================== ======================

Oracle的索引主要包含两类:BTree和位图索引。默认情况下大多使用Btree 索引,该索引就是通常所见唯一索引、聚簇索引等等,Btree用在OLTP,加快查询速度。位图索引是Oracle的比较引人注目的地方,其主要用在OLAP(联机数据分析)方面,也就是数据仓库方面用到,目的是在加快查询速度是,节省存储空间。通常情况下,索引都要耗费比较大的存储空间,位图采用了压缩技术实现磁盘空间缩减。Btree用在高基数(即列的数据相异度大),位图用在低基数列。位图索引的基本原理是在索引中使用位图而不是列值。通常在事实表和维表的键之间有很低的集的势(cardinality),使用位图索引,存储更为有效,与B*Tree 索引比较起来,只需要更少的存储空间,这样每次读取可以读到更多的记录,而且与B*Tree索引相比,位图索引将比较,连接和聚集都变成了位算术运算,大大减少了运行时间,从而得到性能上的极大的提升。 在Oracle中如何合理的使用位图索引?以下的几个事项应该考虑。 *如果要使用位图索引,初始化参数STAR_TRANSFORMATION_ENABLED 应该设置为TRUE. *优化模式应该是CBO。对于数据仓库的环境中,总是应该考虑使用CBO (COST-BASEDOPTIMIZER)。 *位图索引应该建立在每一个事实表的外键列上。(这只是一个一般的规则.) 此外,对于数据表中的cardinality如何客观的确定也是一个问题,一万条数据中只包含3个值的集和算是低的了,那么一亿条记录中包含3万条记录算不算低的呢?对于这样的情况,建议几行一下数据的模拟测试,一般来说,在数据仓库环境中,位图索引的性能要好于B*Tree索引。还要注意位图索引不是为OLTP 数据库设计的,不应该在OLTP数据库中大量的使用它,尤其是对那些有更新操作的表。 ==================================================================== ========== B*Tree索引 B*Tree索引是最常见的索引结构,默认建立的索引就是这种类型的索引。B*Tree索引在检索高基数数据列(高基数数据列是指该列有很多不同的值)时提供了最好的性能。当取出的行数占总行数比例较小时B-Tree索引比全表检索提供了更有效的方法。但当检查的范围超过表的10%时就不能提高取回数据的性能。B-Tree索引是基于二叉树的,由分支块(branch block)和叶块(leaf block)组成。在树结构中,位于最底层底块被称为叶块,包含每个被索引列的值和行所对应的rowid。在叶节点的上面是分支块,用来导航结构,包含了索引列(关键字)范围和另一索引块的地址,如图26-1所示。

Oracle索引原理

Oracle数据库中的索引详解 一、ROWID的概念 存储了row在数据文件中的具体位置:64位编码的数据,A-Z, a-z, 0-9, +, 和/,row在数据块中的存储方式 SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20; 比如:OOOOOOFFFBBBBBBRRR OOOOOO:data object number, 对应dba_objects.data_object_id FFF:file#, 对应v$datafile.file# BBBBBB:block# RRR:row# Dbms_rowid包 SELECT dbms_rowid.rowid_block_number('AAAGFqAABAAAIWEAAA') from dual; 具体到特定的物理文件 二、索引的概念 1、类似书的目录结构 2、Oracle 的“索引”对象,与表关联的可选对象,提高SQL查询语句的速度 3、索引直接指向包含所查询值的行的位置,减少磁盘I/O 4、与所索引的表是相互独立的物理结构 5、Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引 6、语法:CREA TE INDEX index ON table (column[, column]...); 7、B-tree结构(非bitmap): [一]了解索引的工作原理: 表:emp

目标:查询Frank的工资salary 建立索引:create index emp_name_idx on emp(name);

[试验]测试索引的作用: 1. 运行/rdbms/admin/utlxplan 脚本 2. 建立测试表 create table t as select * from dba_objects; insert into t select * from t; create table indextable as select rownum id,owner,object_name,subobject_name, object_id,data_object_id,object_type,created from t; 3. set autotrace trace explain 4. set timing on 5. 分析表,可以得到cost 6. 查询object_name=’DBA_INDEXES’ 7. 在object_name列上建立索引 8. 再查询 [思考]索引的代价: 插入,更新 三、唯一索引 1、何时创建:当某列任意两行的值都不相同 2、当建立Primary Key(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立 3、语法:CREA TE UNIQUE INDEX index ON table (column); 4、演示

oracle数据库索引的理解与总结

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 例如这样一个查询:SELECT * FROM TABLE1 WHERE ID = 44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),直接在索引里面找44(也就是在ID这一列找),就可以得知这一行的位置,也就是找到了这一行。可见,索引是用来定位的。 建立索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。 虽然建立索引能加快对表中记录的查询或者排序速度,但是并不是索引建得越多越好,这就需要我们了解使用索引过程中,索引的一些优点以及缺陷: 使用索引的好处: 创建索引可以大大提高系统的性能: 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。使用索引的一些不足: 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引: ?在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; ?在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; ?在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; ?在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; ?在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点: ?对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 ?对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了

Oracle索引介绍

Oracle索引简单介绍 更多Oracle资料下载,请收藏https://www.wendangku.net/doc/6b4247401.html,

一、引言 对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助。有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步。 二、B-Tree 我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree。例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree。所以在最开始,简单地介绍一下 B-Tree。 B-Tree不同于Binary Tree(二叉树,最多有两个子树),一棵M阶的B-Tree满足以下条件:1)每个结点至多有M个孩子; 2)除根结点和叶结点外,其它每个结点至少有M/2个孩子; 3)根结点至少有两个孩子(除非该树仅包含一个结点); 4)所有叶结点在同一层,叶结点不包含任何关键字信息; 5)有K个关键字的非叶结点恰好包含K+1个孩子; 另外,对于一个结点,其内部的关键字是从小到大排序的。以下是B-Tree(M=4)的样例:

对于每个结点,主要包含一个关键字数组Key[],一个指针数组(指向儿子)Son[]。在B-Tree 内,查找的流程是:使用顺序查找(数组长度较短时)或折半查找方法查找Key[]数组,若找到关键字K,则返回该结点的地址及K在Key[]中的位置;否则,可确定K在某个Key[i]和Key[i+1]之间,则从Son[i]所指的子结点继续查找,直到在某结点中查找成功;或直至找到叶结点且叶结点中的查找仍不成功时,查找过程失败。 接着,我们使用以下图片演示如何生成B-Tree(M=4,依次插入1~6): 从图可见,当我们插入关键字4时,由于原结点已经满了,故进行分裂,基本按一半的原则进行分裂,然后取出中间的关键字2,升级(这里是成为根结点)。其它的依类推,就是这样一个大概的过程。 三、数据库索引 1.什么是索引 在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象。 A)索引可以避免全表扫描。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页。B)对于非聚集索引,有些查询甚至可以不访问数据页。 C)聚集索引可以避免数据插入操作集中于表的最后一个数据页。

oracle11g基于SQL的优化之索引优化篇

Oracle11g 基于SQL语句性能优化 通过索引对SQL进行优化 主讲人:马飞 所在部门:运维部

一、概述 本文所介绍的索引案例是在使用的是Oracle11g 11.2.0.4 数据库运行的。索引是使用最为普遍的一种优化SQL的方法,不同索引均有各自的优缺点。实际优化中需要综合考虑各种环境因素对运行慢的SQL进行优化。常见环境因素有:数据库表及索引的统计信息、列的柱状图,优化器的模式,表上是否有触发器,表上是否创建了物化视图日志,SQL语句是否使用提示符,当前会话的等待事件等。 Oracle数据库中索引可分为B-TREE索引、BitMap索引、全文索引三大类。按索引列的数量不同可分为,单列索引,多列索引。按列值是否唯一可分为唯一索引和非唯一性索引。 二、B-TREE索引 B-TREE索引常常用在OLTP数据库中,为了提高查询性,但同时一个表中索引数据多时会影响DML语句的性能,所以需要全面考虑增加索引后利弊。 2.1索引分类 主键索引、唯一键索引、非唯一键索引、多列组合索引。当表在创建主键时系统会自动为主键列或列的组合上创建唯一索引,主键索引性能最好。其它索引性能好坏取决于单列或多列的数据选择性,如果索引访问的数据小,性能相对较高,因为访问索引和表的块较少因而性能好。 2.2扫描方式 索引唯一扫描、索引范围扫描,全索引扫描,快速全索引扫描,索引跳跃扫描。 2.3上机实践 2.3.1 索引唯一扫描例子:

unique.txt 注意:由于唯一索引的列中可为空值。如果查询条件中有如下写法,则无法走索引扫描。因为b-tree索引中不存储空值。 (1)select * from tab where col is null (2)select * from tab where col is not null (3)select count(0) from tab; 其中(3)中的语句是否走索引取决于唯一索引的列上是否为非空,如果是非空,则会走“INDEX FAST FULL SCAN”快速索引扫描(采用并行索引扫描方式进行取读索引块,效率非常高)。 2.3.2 索引范围扫描例子 在非唯一性索引上的扫描通常都采用索引范围的扫描方式进行。 scan.txt scan2.txt 2.3.3 全索引扫描例子 全索引扫描指的是查询语句的所有列均在索引列中,同时需要访问全表的数据时使用。 indexfull.txt 2.3.4 快速全索引扫描例子 fast_fullscan.txt 2.3.5 索引跳跃扫描例子 skip.txt 2.4索引利弊 优点:当访问表中少量数据时可以提高查询的性能。

Oracle视图中建立索引的注意事项

Oracle视图中建立索引的注意事项 在视图上创建索引需要三个条件: 一、视图必须绑定到架构。 要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击右键,属性,选中“绑定到架构”。 二、索引必须是唯一索引。 要做到这点,在 CREATE INDEX 中必须指定 UNIQUE。 三、索引必须是聚集索引。 要做到这点,在 CREATE INDEX 中必须指定 CLUSTERED。 例: CREATE VIEW viewFoo WITH SCHEMABINDING AS SELECT id... CREATE UNIQUE CLUSTERED INDEX index_viewFoo ON viewFoo(id) 在视图上创建聚集索引之前,该视图必须满足下列要求: 当执行 CREATE VIEW 语句时,ANSI_NULLS 和 QUOTED_IDENTIFIER 选项必须设置为 ON。OBJECTPROPERTY 函数通 过 ExecIsAnsiNullsOn 或 ExecIsQuotedIdentOn 属性为视图报告此信息。 为执行所有 CREATE TABLE 语句以创建视图引用的表,ANSI_NULLS 选项必须设置为 ON。 视图不能引用任何其它视图,只能引用基表。 视图引用的所有基表必须与视图位于同一个数据库中,并且所有者也与视图相同。 必须使用 SCHEMABINDING 选项创建视图。SCHEMABINDING 将视图绑定到基础基表的架构。 必须已使用 SCHEMABINDING 选项创建了视图中引用的用户定义的函数。 表和用户定义的函数必须由 2 部分的名称引用。不允许使用 1 部分、3 部分和 4 部分的名称。

Oracle 创建索引

Oracle创建索引 Oracle在创建索引时要遵循以下的原则: ●平衡查询和DML的需要。在易挥发(DML操作频繁)的表上尽量减少索引的数量, 因为索引虽然加快了查询的速度,但却降低了DML操作速度。 ●将其放入单独的表空间,不要与表、临时段或还原(回滚)段放在一个表空间,因为索 引段会与这些段竞争输入/输出(I/O)。 ●使用统一的EXTENT尺寸:数据块尺寸的5倍,或表空间的MINIMUM EXTENT的尺 寸。这样做的目的是为了减少系统的转换时间。 ●对大索引可以考虑使用NOLOGGING。这样做的目的是通过减少REDO操作来提高系 统的效率,但是如果一旦系统发生崩溃,则该索引一般是无法进行完全灰度的。不过问题也不是很大,因为真正的数据还在表中,所以可以通过重建该索引来恢复与之前完全相同的效果。 ●索引的INITRANS参数通常应该比相对应表的高。以为索引项要比表中的数据行小的 多,所以一个数据块可以存放更多的索引项(记录)。 创建索引的命令格式: CREATE (UNIQUE|BITMAP) INDEX [用户名.]索引名 ON [用户名.]表名 (列名[ASC | DESC] [,列名[ASC| DESC ] ]…) [TABLESPACE 表空间名] [PCTFREE 正整型数] [INITRANS 正整型数] [MAXTRANS 正整型数] [存储子句] [LOGGING | NOLOGGING] [NOSORT] 其中, ●UNIQUE:说明该索引是唯一索引,默认是非唯一的 ●ASC:说明所创建的索引为升序 ●DESC:说明所创建的索引为降序 ●表空间名:说明将要创建的索引的表空间名 ●PCTFREE:在创建索引时每一个块中预留的空间 ●INITRANS:在每一个块中预分配的事物记录数,默认值为2 ●MAXTRANS:在每一个块中可以分配的事物记录数的上限,默认为255 ●存储子句:说明在索引中EXTENTS怎样分配 ●LOGGING:说明在创建索引是和以后的索引操作中要记录联机重做日志文件(默认)●NOLOGGING:说明索引的创建和一些数据装入操作将不记录联机重做日志文件 ●NOSORT:数据库中所存的数据行已经按升序排好,因此在创建索引时不需要再排序了●PCTUSED:在索引中不能说明该参数。因为索引记录必须以正确的顺序存放,所以用 户不能控制何时向索引块中插入索引数据行 使用数据字典的dba_indexes获取有关scott用户的索引基于表、所在的表空间、索引的类型和索引的状态等信息。 SQL> select index_name,table_name,tablespace_name,index_type, uniqueness,status from dba_indexes where owner = 'SCOTT' AND INDEX_NAME not like 'SYS%'

Oracle 索引基础

Oracle 索引基础 如果一个表中包含有很多条记录,当对表执行查询时,必须将所有的记录一一取出,以便将每一条记录与查询条件进行比较,然后再返回满足条件的记录。这样进行操作的时间开销和I/O开销都是十分巨大的。这时就可以考虑通过建立索引来减少开销。 简单地说,如果将表看作一本书,索引的作用则类似于书中的目录。在没有目录的情况下,要在书中查找指定的内容必须阅读全书,而有了目录之后,只需要通过目录就可以快速找到包含所需内容的页。类似地,如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。 因此,合理地使用索引可以大大降低磁盘的I/O次数,从而提高数据访问性能。假设EMP表中的数据占用了10000了数据块,如果EMPNO列上不存在索引,那么当执行查询操作时需要执行全表扫描,这种操作的I/O次数为10000次;如果EMPNO列上存在索引(假设索引层次为2),那么执行查询时将使用索引进行扫描(I/O次数为4次)。 索引与表一样,不仅需要在数据字典中保存索引的定义,还需要在表空间中为它分配实际的存储空间。当创建索引时,Oracle会自动在用户的默认表空间中或指定的表空间中创建一个索引段,为索引数据提供存储空间。与创建表的情况类以,在创建索引时也可以为它设置存储参数。 为某个表创建的索引不必和该表保存在同一个表空间中。如果将索引和对应的表分别存放在位于不同硬盘上的不同的表空间中,反而能够提高查询的速度。因为Oracle能够并行读取不同硬盘中的数据,这样的查询可以避免产生I/O冲突。 在创建索引时,Oracle首先对将要建立索引的字段进行排序,然后将排序后的字段值和对应记录的ROWID存储在索引段中。例如,假设使用下面的语句为EMP表中的ENAME 字段创建索引: SQL> create index emp_ename on emp (ename); 索引已创建。 Oracle首先在EMP表中按照ENAME字段进行排序,默认为升序排序,然后按照排序后的顺序将ENAME字段值和对应的ROWID逐个保存在索引中。建立索引的字段被称为索此字段,例如ENAME字段即为索引字段。 在索引创建之后,如果执行一条在WHERE子句中引用了ENAME字段的查询。例如:SQL> select ename,hiredate,sal 2 from emp 3 where ename='SMITH'; ENAME HIREDA TE SAL ---------- -------------- --------- SMITH 17-12月-80 960 Oracle将首先对索引中的ENAME字段进行一次快速搜索(因为索引中的ENAME字段已经排序,所以该搜索是非常快的),找到符合条件的ENAME字段值所对应的ROWID,然后再利用ROWID到EMP表中提取相应的记录。这个操作比逐条读取EMP表中未排序的记录要快得多。可以看出,在索引中只保存索引字段的值与相应的ROWID,这种组合称为

Oracle数据库创建索引的几个原则

在Oracle数据库中要合理的创建索引有如下几个要求。 一、根据表的大小来创建索引。 虽然给表创建索引,可以提高查询的效率。但是数据库管理员需要注意的是,索引也需要一定的开销的。为此并不是说给所有的表都创建索引,那么就可以提高数据库的性能。这个认识是错误的。恰恰相反,如果不管三七二十一,给所有的表都创建了索引,那么其反而会给数据库的性能造成负面的影响。因为此时滥用索引的开销可能已经远远大于由此带来的性能方面的收益。所以笔者认为,数据库管理员首先需要做到,为合适的表来建立索引,而不是为所有的表建立索引。 一般来说,不需要为比较小的表创建索引。如在一个ERP系统的数据库中,department表用来存储企业部门的信息。一般企业的部分也就十几个,最多不会超过一百个。这100条记录对于人来说,可能算是比较多了。但是对于计算机来说,这给他塞塞牙缝都还不够。所以,对类似的小表没有必要建立索引。因为即使建立了索引,其性能也不会得到很大的改善。相反索引建立的开销,如维护成本等等,要比这个要大。也就是说,付出的要比得到的多,显然违反常理。 另外,就是对于超大的表,也不一定要建立索引。有些表虽然比较大,记录数量非常的多。但是此时为这个表建立索引并一定的合适。如系统中有一张表,其主要用来保存数据库中的一些变更信息。往往这些信息只给数据库管理员使用。此时为这张表建立索引的话,反而不合适。因为这张表很少用到,只有在出问题的时候才需要查看。其次其即使查看,需要查询的纪录也不会很多,可能就是最近一周的更新记录等等。对于对于一些超大的表,建立索引有时候往往不能够达到预计的效果。而且在打表上建立索引,其索引的开销要比普通的表大的多。那么到底是否给大表建立索引呢?笔者认为,主要是看两个方面的内容。首先是需要关注一下,在这张大表中经常需要查询的记录数量。一般来说,如果经常需要查询的数据不超过10%到15%的话,那就没有必要为其建立索引的必要。因为此时建立索引的开销可能要比性能的改善大的多。这个比例只是一个经验的数据。如果数据库管理员需要得出一个比较精确的结论,那么就需要进行测试分析。即数据库管理员需要测试一下全表扫描的时间,看看其是否比建立索引后的查询时间要长或者短。如果是长的话,则说明有建立索引的必要。但是如果没有的话,则说明还是全表扫描速度来的快。此时也就没有必要建立索引了。 总之,在考虑是否该为表建立索引时,一般来说小表没有建立索引的必要。而对于打表的话,则需要进行实际情况实际分析。简单一点的,可以根据大致的比率来确定。如果要精确一点的,则可以进行全表扫描性能分析,以判断建立索引后是否真的如预期那样改善了数据库性能。 二、根据列的特征来创建索引。

oracle索引类型和使用技巧

1.不同类型索引和适用范围 Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来 说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。 而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进 程在几分钟得以完成,这样会使您立刻成为一位英雄。下面就将简单的讨论每个索引选项。 1.1.B树索引 (默认类型) 树索引在Oracle中是一个通用索引。在创建索引时它就是默认的索引类型。B树索引可以是一个列的(简单)索引,也可以是组合/复合(多个列)的索引。B树索引最多可以包括32列。在下图的例子中,B树索引位于雇员表的last_name列上。这个索引的二元高度为3;接 下来,Oracle会穿过两个树枝块(branch block),到达包含有ROWID的树叶块。在每个树枝块中,树枝行包含链中下一个块的ID号。 树叶块包含了索引值、ROWID,以及指向前一个和后一个树叶块的指针。Oracle可以从两个方向遍历这个二叉树。B树索引保存了在索引列上有值的每个数据行的ROWID值。Oracle不会对索引列上包含NULL值的行进行索引。如果索引是多个列的组合索引,而其 中列上包含NULL值,这一行就会处于包含NULL值的索引列中,且将被处理为空(视为NULL)。 技巧:索引列的值都存储在索引中。因此,可以建立一个组合(复合)索引,这些索引可以 直接满足查询,而不用访问表。这就不用从表中检索数据,从而减少了I/O量。 B-tree 特点: 适合与大量的增、删、改(OLTP) 不能用包含OR操作符的查询; 适合高基数的列(唯一值多) 典型的树状结构; 每个结点都是数据块; 大多都是物理上一层、两层或三层不定,逻辑上三层; 叶子块数据是排序的,从左向右递增; 在分支块和根块中放的是索引的范围;

Oracle索引的应用

Oracle索引的应用 在本练习中,将为HR模式中的STUDENT表创建索引,并查看索引的使用情况。 (1)连接到HR模式,使用如下的语句在STUDENT表的SNAME列上创建B树非惟一索引: create index name_index on Student(Sname) tablespace users; (2)在STUDENT的班级信息列上创建位图索引: create bitmap index sclass_index on Student(classid) tablespace users; (3)执行如下的查询语句,并查看Oracle的执行计划。 set autotrace traceonly select * from student where sname='王丽'; (4)根据索引的使用情况,并删除不经常使用的索引。 alter index name_index monitoring usage; select * from v$object_usage where table_name=upper('student'); (5)查看索引的状态,是否存有过多的碎片,当被删除的叶结点过多时,就说明该B 树索引存在过多的碎片,这就需要重建或合并该索引。 analyze index name_index validate structure; select br_pows,br_blks,lf_rows,del_lf_rows from index_stats where name=upper('name_index'); alter index name_index COALESCE DEALLOCATE UNUSED;--合并索引 alter index name_index REBUILD; --在原来的表空间重建索引

oracle索引说明

第一章由浅至深讲解Oracle数据库 B-tree索引B-tree索引结构: B-tree索引: ·索引会随着时间的增加而变的不平衡; ·删除的索引空间不会被重用; ·随着索引层数的增加,索引将会变得无效并需要重建; ·聚簇因子差,索引需要重建; ·为了提高性能,索引需要经常重建; 索引基础 ·一个更新由一个删除和一个插入组成;

·页块由索引条目(row header(2/3B)|length(1B)|indexed data value(nB)|length (1B)|RowID(6B))和相应的rowid组成; ·每个页块包含两个指针分别前面的页块和后面页块; Treedump alter session set events ‘immediate trace name treedump level index_object _id’; ----- begin tree dump branch: 0x424362 4342626 (0: nrow: 2, level: 1) leaf: 0x424363 4342627 (-1: nrow: 540 rrow: 540) leaf: 0x424364 4342628 (0: nrow: 461 rrow: 461) ----- end tree dump 以上dump包含的信息如下: 块类型:branch(分支块);leaf(页块); 块地址:0x424362 4342626; nrow:索引条目的数量; rrow:当前块中的索引条目数量; level:分支块等级(页块隐示为0); Block Dump alter system dump datafile X block X; alter system dump datafile X block min X1 block max X2

Oracle 索引 详解

Oracle 索引详解 https://www.wendangku.net/doc/6b4247401.html,/tianlesoftware/article/details/5347098 一.索引介绍 1.1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX . ON . ( | ASC | DESC, | ASC | DESC,...) TABLESPACE STORAGE LOGGING | NOLOGGING COMPUTE STATISTICS NOCOMPRESS | COMPRESS NOSORT | REVERSE PARTITION | GLOBAL PARTITION 相关说明 1)UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree 索引。 2) | ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引” 3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高) 4)STORAGE:可进一步设置表空间的存储参数 5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING 来减少占用空间并提高效率) 6)COMPUTE STATISTICS:创建新索引时收集统计信息 7)NOCOMPRESS | COMPRESS:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值) 8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相

Oracle全文索引技术-使用说明文档解析

[Oracle全文索引技术] 使用说明文档 金联万家(北京)电子支付科技发展有限公司

修改记录 目录 1 前言 (3) 1.1 编写目的 (3) 1.2 名词解释 (3) 1.3 参考资料 (3) 2 oracle全文索引技术 (4) 3 建立全文索引的操作步骤 (4) 3.1 查看用户与角色 (4) 3.2 开启目标用户全文索引权限 (4) 3.3 设置语法分析器Lexer (5) 3.4 建立索引 (5) 3.5 使用索引 (6) 4 全文索引的种类 (6) 5 对多字段建立索引 (6) 6 Oracle全文索引之 - CONTEXT (7) 6.1 函数 CONTAINS 语法 (7) 6.2 全文索引的维护 (7) 6.2.1 同步数据 (8) 6.3 单个中文字查询问题 (9) 7 建立全文索引的完整脚本 (10) 8 附录 (14)

1前言 1.1编写目的 本文档主要说明Oracle全文索引技术的使用与维护,为数据库操作使用人员提供参考维护手册。 1.2名词解释 表 1.术语表 1.3参考资料 表 2.参考资料列表

2oracle全文索引技术 全文检索:是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。 【Oracle Text 全文检索】 Oracle一直致力于全文检索技术的研究,当Oracle9i Rlease2发布之时,Oracle数据库的全文检索技术已经非常完美,Oracle Text使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力。Oracle Text是Oracle9i 采用的新名称,在Oracle8/8i中它被称作Oracle interMedia Text,在Oracle8以前它的名称是Oracle ConText Cartridge。使用Oracle9i和Oracle Text,可以方便而有效地利用标准的SQL工具来构建基于文本的新的开发工具或对现有应用程序进行扩展。应用程序开发人员可以在任何使用文本的Oracle数据库应用程序中充分利用Oracle Text搜索,应用范围可以是现有应用程序中可搜索的注释字段,也可是实现涉及多种文档格式和复杂搜索标准的大型文档管理系统。Oracle Text支持Oracle数据库所支持的大多数语言的基本全文搜索功能。 扩展阅读: https://www.wendangku.net/doc/6b4247401.html,/view/663956.htm 3建立全文索引的操作步骤 3.1查看用户与角色 检查数据库中是否有CTXSYS 用户和CTXAPP 角色 如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。你必须修改数据库以安装这项功能。默认安装情况下,ctxsys用户是被锁定的,因此要先启用ctxsys的用户。 -- 锁住用户 ALTER USER ctxsys ACCOUNT LOCK PASSWORD EXPIRE; -- 解锁用户 ALTER USER ctxsys ACCOUNT UNLOCK IDENTIFIED BY ctxsys; 如果没有该用户,则需要打开dbca工具中选择configrue database options,然后选择所有数据库组件安装即可。 3.2开启目标用户全文索引权限 赋权在ctxsys用户下把ctx_ddl的执行权限赋于要使用全文索引的用户,例: GRANT EXECUTE ON ctx_ddl TO username;

Oracle用户名重建索引方法探究 (1)

每个DBA都应该知道数据索引的重要性。特别是管理Oracle的DBA,很多应用项目会涉及到大量的修改删除操作,数据索引是需要周期性的重建的。这里介绍的根据Oracle用户名重建索引的方法可以帮助我们提高查询性能。 更重要的是,它不仅可以提高查询性能,还能增加索引表空间空闲空间大小。在Oracle里大量删除记录后,表和索引里占用的数据块空间并没有释放。重建索引可以释放已删除记录索引占用的数据块空间。 下面是可以按Oracle用户名生成重建索引的SQL脚本: 1.SET ECHO OFF; 2.SET FEEDBACK OFF; 3.SET VERIFY OFF; 4.SET PAGESIZE 0; 5.SET TERMOUT ON; 6.SET HEADING OFF; 7.ACCEPT username CHAR PROMPT 'Enter the index username: '; 8.spool /oracle/rebuild_&username.sql; 9.SELECT 10.'REM +-----------------------------------------------+' || chr(10) || 11.'REM | INDEX NAME : ' || owner || '.' || segment_name 12.|| lpad('|', 33 - (length(owner) + length(segment_name)) ) 13.|| chr(10) || 14.'REM | BYTES : ' || bytes 15.|| lpad ('|', 34-(length(bytes)) ) || chr(10) || 16.'REM | EXTENTS : ' || extents 17.|| lpad ('|', 34-(length(extents)) ) || chr(10) || 18.'REM +-----------------------------------------------+' || chr(10) || 19.'ALTER INDEX ' || owner || '.' || segment_name || chr(10) || 20.'REBUILD ' || chr(10) || 21.'TABLESPACE ' || tablespace_name || chr(10) || 22.'STORAGE ( ' || chr(10) || 23.' INITIAL ' || initial_extent || chr(10) || 24.' NEXT ' || next_extent || chr(10) || 25.' MINEXTENTS ' || min_extents || chr(10) || 26.' MAXEXTENTS ' || max_extents || chr(10) || 27.' PCTINCREASE ' || pct_increase || chr(10) || 28.');' || chr(10) || chr(10) 29.FROM dba_segments 30.WHERE segment_type = 'INDEX' 31.AND owner='&username' 32.ORDER BY owner, bytes DESC; 33.spool off; 如果你用的是Windows系统,想改变输出文件的存放目录,修改spool后面的路径成:

相关文档
相关文档 最新文档