首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Oracle DB 目录

2013-10-17 
Oracle DB 索引索引是数据库对象,可以通过创建索引来提高一些查询的性能。在你创建主键或唯一约束条件时,服

Oracle DB 索引
索引是数据库对象,可以通过创建索引来提高一些查询的性能。在你创建主键或唯一约束条件时,服务器会同时自动创建索引。索引索引具有以下特点:? 是一个方案对象? Oracle Server 可用来通过指针加快行检索速度? 可通过使用快速路径访问方法迅速找到数据来减少磁盘的输入/ 输出(I/O) ? 与建立索引的表无关? 由Oracle Server 自动使用和维护
Oracle Server  索引是一个方案对象,可以通过指针加快行检索速度。可以显式创建索引,也可以自动创建索引。如果没有在列上建立索引,则会对整个表进行扫描。使用索引可以直接而快速的访问表中的行。其作用是通过使用索引路径快速找到数据来减少磁盘的I/O。索引由Oracle Server  自动使用和维护。创建索引之后,就不需要用户直接执行任何操作了。索引在逻辑上和实际上都独立于建立索引的表。这意味着可以在任何时候创建或删除索引,而不会对基表或其它索引产生任何影响。注:在删除表时,会另外删除相应的索引。


如何创建索引? 自动创建:如果在表定义中定义了PRIMARY KEY 或UNIQUE 约束条件,则会自动创建一个唯一的索引。? 手动创建:用户可以通过对列创建非唯一的索引来加快行访问速度。
可以创建两种类型的索引。? 唯一索引:如果你在表中定义的列具有PRIMARY KEY 或UNIQUE 约束条件,则Oracle Server  会自动创建此类型的索引。索引的名称和约束条件的名称相同。? 非唯一索引:这种类型的索引可以由用户创建。例如,可以通过在查询中为联接创建一个FOREIGN KEY 列索引来提高检索速度。注:可以手动创建唯一索引,但是建议你创建唯一约束条件,这样可隐式创建唯一索引。
创建索引? 对一个或多个列创建索引:

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>

      ON <schema>.<table_name>

           (<column_name> | <expression> ASC | DESC,
            <column_name> | <expression> ASC | DESC,...)
     TABLESPACE <tablespace_name>
     STORAGE <storage_settings>
     LOGGING | NOLOGGING
    COMPUTE STATISTICS
     NOCOMPRESS | COMPRESS<nn>
     NOSORT | REVERSE
     PARTITION | GLOBAL PARTITION<partition_setting>

 

相关说明

1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。
2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引”
3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)
4)STORAGE:可进一步设置表空间的存储参数
5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)
6)COMPUTE STATISTICS:创建新索引时收集统计信息
7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)
8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值
9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区


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


? 提高对EMPLOYEES 表中LAST_NAME 列的查询访问速度:
CREATE INDEX emp_last_name_idx    ON employees(last_name);



索引创建准则在以下情况下应创建索引:列包含值的范围很广列包含大量空值在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是索引的名称。注:如果删除了一个表,则会自动删除索引和约束条件,但会保留视图和序列。

热点排行