当前位置:  数据库>oracle

Oracle数据库对象_索引

    来源: 互联网  发布时间:2017-06-22

    本文导语: 查询是在表上进行的最频繁的访问。 在查询数据时,很少有用户愿意查询表中的所有数据,除非要对整个表进行处理。一般情况下用户总是查询表中的一部分数据。 在SELECT语句中,通常需要通过WHERE子句指定查询条件,以获得...

查询是在表上进行的最频繁的访问。

在查询数据时,很少有用户愿意查询表中的所有数据,除非要对整个表进行处理。
一般情况下用户总是查询表中的一部分数据。

在SELECT语句中,通常需要通过WHERE子句指定查询条件,以获得满足该条件的所有数据。
如果能够在很小的范围内查询需要的数据,而不是在全表范围内查询,那么将减少很多不必要的磁盘1/0 ,查询的速度无疑会大大加快。
提供这种快速查询的方法就是索引。

索引的基本概念

索引是一种建立在表上的数据库对象,它主要用于加快对表的查询操作。

合理使用索引可以大大减少磁盘访问的次数,从而大大提高数据库的性能。
使用索引的主要目的是加快查询速度,另外,索引也可以作为唯一性约束。

如果在表的一个列上建立了唯一性索引,那么系统将自动在这个列上建立唯一性约束,这样可以保证插入这个列的数据是唯一的。

索引究竟是怎样加快查询速度的呢?

原来,索引是建立在表中的某个列或几个列上的,这样的列称为索引列。
在创建索引时,数据库服务器将对索引列的数据进行排序,并将排序的结果存储在索引所占用的存储空间中。
在查询数据时,数据库服务器首先在索引中查询,然后再到表中查询。
因为索引中的数据事先进行了排序,所以只需要很少的查找次数就可以找到需要的数据。

在索引中,不仅存储了索引列上的数据,而且还存储了一个ROWID 的值。
ROWID是表中的一个伪列,是数据库服务器自动添加的,表中的每一行数据都有一个ROWID值,它代表这一行的标识,即一行数据在存储空间的物理位置。
在访问表中的数据时,都要根据这个伪列的值找到数据的实际存储位置,然后再进行访问。
由于索引列上的数据已经进行了排序,在索引中很快就能找到这行数据,然后根据ROWID就能直接到表中找到这行数据了。

需要注意的是,表是独立于索引的,无论对在表上建立了多少索引,无论索引对表中的数据进行什么样的排序,表中的数据都不会有任何变化。

在查询一行数据时,首先在索引中查询该行的行标识,然后根据这个行标识找到表中的数据。
因为索引中的数据是经过排序的,所以采用了折半查找法查找数据,以达到快速查找的目的。

利用折半查找法在索引中查找数据的过程类似于遍历一棵二叉树,首先与根节点比较,如果与查找的数据相同,则一次访问就完成查询。
如果要查找的数据小于根节点,则在根节点的左子树中查找,否则在右子树中查找,这样查找的范围将缩小一半。
按照这种方法,每次将查找范围缩小一半,然后在剩下的节点中继续查找,直到找到所需的数据。

按照索引列的值是否允许重复,索引可以分为唯一性索引和非唯一性索引,其中唯一性索引可以保证索引列的值是唯一的。
按照索引列中列的数目,索引可以分为单列索引和复合索引。
按照索引列的数据的组织方式,索引可以分为B+树索引、位图索引、反向索引和基于函数的索引,这里仅介绍B+树索引的用法。

合理地使用索引固然可以大大提高数据库的查询性能,但是不合理的索引反而会降低数据库的性能,尤其是在进行DML操作时。
在创建索引时,表中的数据将被排序,如果对表进行了DML操作,表中的数据发生了变化,这时索引中的数据也将被重新排序,如果在表上建立了多个索引,那么每个索引中的数据都要被重新进行排序。

这种排序的开销是很大的,尤其是表非常大时。

索引是关系型数据库系统用来提高性能的有效方法之一,索引的使用可以减少磁盘访问的次数,从而大大提高了系统的性能。
但是在设计索引时必须全面考虑在表上所进行的操作,如果在表上进行的主要操作是查询操作,那么可以考虑在表上建立索引,如果在表上要进行频繁
的DML操作,那么索引反而会引起更多的系统开销。

一般来说,创建索引要遵循以下原则:
·如果每次查询仅选择表中的少量行,应该建立索引。

·如果在表上需要进行频繁的DML操作,不要建立索引。
·尽量不要在有很多重复值的列上建立索引。
·不要在太小的表上建立索引。

在一个小表中查询数据时,速度可能已经足够快,如果建立索引,对查询速度不仅没有多大帮助,反而需要一定的系统开销。

索引的创建、修改和删除

索引可以自动创建,也可以手工创建。如果在表的一个列或几个列上建立了主键约束或者
唯一性约束,那么数据库服务器将自动在这些列上建立唯一性索引,这时索引的名字与约束的
名字相同。
手工创建索引需要执行SQL命令,创建索引的命令是CREATE INDEX 。一个用户可以在自
己的模式中创建索引,只要这个用户具有CREATE INDEX这个系统权限。如果希望在其他用户
的模式中创建索引,那么需要具有CREATE ANY INDEX这个系统权限。
CREATE INDEX 命令的语法格式为:

CREATE INDEX 索引名 ON 表名(列1,列2 ...);

在这个索引中,索引列只有一个,这样的索引称为单列索引。

如果要建立复合索引,则要指定多个列。

例如:

CREATE INDEX ind_de_dn ON test(deptno, dname);

复合索引主要用于多个条件的查询语句中。

在默认情况下,创建的索引是非唯一的,也就是说,在表中的索引列上允许存在重复值。
如果要创建唯一性索引,那么需要使用关键字UNIQUE 。

例如:

CREATE UNIQUE INDEX ind_de ON test(deptno);

一般情况下,在指定索引中的列时,要遵循以下原则:

在WHERE子句中经常使用的列上创建索引。
尽量不要在具有大量重复值的列上创建索引。
具有唯一值的列是建立索引的最佳选择,但是究竟是否在这个列上建立索引,还要看是否对这个列经常进行查询。
如果WHERE子句中的条件涉及多个列,可以考虑在这些列上创建一个复合索引。

正如前面所说,合理设计的索引将提高系统的性能,而不合理的索引反而会降低系统性能。
所以,在数据库的运行过程中,要经常利用SQL Trace检查索引是否被使用,检查索引是否像期望的那样提高了数据库的性能。
如果一个索引并设有被频繁地使用,或者一个索引对数据库性能的提高只有微小的帮助甚至设有帮助,这时可以考虑删除这个索引。

索引信息的查询

与索引有关的数据字典有两个: user_indexes和user_ind_columns 。
例如,要查询索引的类型、所基于的表、是否唯一性索引,以反状态、等信息,可以执行以下查询语句:

SELECT index_type, table_name, status FROM user_indexes WHERE index_name='IND_DE';

下面的查询语句用来获得索引所基于的表和表上的列:

SELECT table_name, column_name FROM user_ind_columns WHERE index_name='IND_DE';

数据字典视图user_ind_columns各列的定义和意义如下:

名称         意义

INDEX_NAME    Index name 

TABLE_NAME    Table or cluster name 

COLUMN_NAME   Column name or attribute of object column

COLUMN_POSITION Position of column or attribute within index

COLUMN_LENGTH  Maximum length of the column or attribute, in bytes

CHAR_LENGTH      Maximum length of the column or attribute, in characters

DESCEND      DESC if this column is sorted descending on disk, otherwise ASC

注:cluster 簇表;

attribute 属性

数据字典视图user_indexes常用各列的定义和意义如下:

名称          意义

INDEX_NAME      索引名称 

INDEX_TYPE     索引类型

TABLE_OWNER     对象属主

TABLE_NAME         对象名称     

TABLE_TYPE      对象类型

STATUS       状态

注:数据字典视图user_indexes上列有很多。


    
 
 

您可能感兴趣的文章:

  • Oracle与Mysql主键、索引及分页的区别小结
  • 从Oracle的约束到索引
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle9i取得建表和索引的DDL语句
  • oracle10g全文索引自动同步语句使用方法
  • Oracle建立二进制文件索引的方法
  • 在Oracle 10g中如何获得索引的专家建议
  • Oracle全文索引设置
  • 用Oracle 9i全索引扫描快速访问数据
  • Oracle中如何把表和索引放在不同的表空间里
  • Oracle索引存储关系到数据库的运行效率
  • Oracle索引聚簇表的数据加载
  • 在Oracle中监控和跟踪索引使用情况
  • oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .
  • Oracle中检查是否需要重构索引的sql
  • 轻松取得Oracle 9i建表和索引DDL语句
  • 深度揭露Oracle索引使用中的限制
  • Oracle索引(B*tree与Bitmap)的学习总结
  • oracle 索引不能使用深入解析
  • SQL Server和Oracle数据库索引介绍
  • Oracle exp 导出用户对象
  • oracle查看会话锁定的所有对象代码分享
  • 测试添加Oracle中Blob数据类型对象
  • 基于Oracle的面向对象技术入门基础简析开发者网络Oracle
  • Oracle中关数据库对象的统计分析
  • Oracle使用PL/SQL操作COM对象
  • 浅析Oracle对象和数据的导入导出
  • Oracle PL/SQL编程有关的数据库对象
  • Oracle中重新编译无效的存储过程, 或函数、触发器等对象
  • 在Oracle中监控和跟踪索引使用情况 iis7站长之家
  • ORACLE 常用的SQL语法和数据对象
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • Oracle 数据库开发工具 Oracle SQL Developer
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • 关于JDBC连接Oracle数据库,是否必须有Oracle客户端
  • ORACLE数据库常用字段数据类型介绍
  • win2000+jbuilder6+oracle817编出的程序,在win2000下执行很好,在win98下却访问不了oracle数据库
  • oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)
  • Oracle发布Oracle SQL Developer 1.2数据库开发工具 帮助用户简化开发工作
  • 怎样调出ORACLE数据库中的数据,该如何连接?
  • Oracle收购TimesTen 提高数据库软件性能
  • 卸载oracle数据库
  • Oracle数据库恢复后心得
  • linux上安装oracle 数据库后,是否能写shell程序实现数据库的自动启动。
  • Linux下如何用C语言操作Oracle数据库相关的图书推荐
  • Oracle数据库运行Oracle form时避免出现提示信息
  • Oracle欲收购开源数据库MySQL未果
  • 如何在JBuilder中连接Oracle数据库?
  • Oracle数据库访问参数文件的顺序
  • 循序渐进学习Oracle数据库
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle 10g和Oracle 11g网格技术介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3