索引是为了提高数据检索效率而创建的一种独立于表的存储结构,由Oracle系统自动进行维护。

索引的概述 

      索引是一种可选的与表或簇相关的数据库对象,能够为数据的查询提供快捷的存储路径,减少数据查询的磁盘I/O,提高数据的检索效率。

Oracle建议将索引与表分散存储在不同的表空间中。

在索引结构中,有索引值(其实相当于目录的标题)及其相应记录的物理地址ROWID(相当于内容的页码)。

在创建索引后。对表进行DML操作时,Oracle自动使用和维护索引。索引自动更新的步骤为

(1)在向表插入数据时,系统自动在索引的叶子节点中插入语数据对应的索引条目

(2)删除数据时,系统自动在索引的叶子节点中逻辑上删除相应的条目,当空间没被回收,知道整个节点被删除。

(3)更新数据时,系统会删除索引叶子节点中相应的索引条目,然后重新插入新的索引条目。

2.索引的结构:

在Oracle中索引的结构有两种,分别是平衡树(B_Tree)结构索引和位图(Bitmap)索引。

平衡树(B_Tree)结构索引:

位图(Bitmap)索引:也是按照平衡树结构组织的,但是在叶子节点中每个索引值对应一个位图而不是ROWID.

3.索引的分类:B-树索引:是默认创建的索引

B-树聚簇索引:在聚簇字段上创建的索引

散列索引:在散列簇的聚簇字段上创建的索引

全局索引和分区索引:在分区表上创建的索引

位图索引:按位图结构组织的索引,合适索引值取值范围小,重复率高的索引。

函数索引:基于包含索引列的函数或表达式创建的索引(索引值为计算后的值)。

域索引:仅限于特定的应用。

4.索引的管理策略:

因为索引在提高数据检索的同时,会减低对数据进行DML操作的效率。此外,索引作为一个独立的数据库对象,占用一定的存储空间。

(1).导入/装载数据后创建索引。

(2).选择合适的索引类型。

可以从几方面考虑:

列的基数的大小:如果列的基数比较大,数据重复率低,应该采用B-树索引;如果列的基数小,重复率高,采用位图索引。

空值(null):B-树索引忽略空值,而位图索引中可以包含索引值为空值的记录信息。因此如果要根据某列与空值相关的查询,可以在该列上创建位图索引。

逻辑运算:逻辑运算能直接在位图索引内完成,所以查询条件中包含and or等使用位图索引

比较运算:比较运算使用B-树索引

存储空间:B-树索引会占用存储空间,而位图索引则占用较少的存储空间。

(3).在适当表和适当列上创建索引

对于大表而言,如果经常查询的记录数目少于表中所有记录总数的15%,则可以考虑创建索引。

为了提高多表查询的效率,应该在各个参与连接的表上创建索引。

数据量很小的小表,不需要创建索引

不能再LONG LONG RAW LOB列上创建索引。

(4)合理设置复合索引中列的顺序:

应该将频繁使用的列放在其他列的前面。

(5)限制索引的的数目

(6)为索引设置合适的PCTFREE参数

(7)选择存储索引的表空间

在默认情况下,索引和表空间存储在同一个表空间中,有力于数据库的维护操作,保证表与索引同时处于联机或脱机状态,具有较高的可用性。反之则可提高系统存取性能。

创建索引

         1.创建非唯一性索引

在默认情况下,create index语句创建的是非唯一性的B-树索引。

在employees表的job_id上创建一个非唯一性索引

SQL> create index emp_job_index on employees(job_id)
2 storage(initial 20k next 20K pctincrease 75)
3 tablespace users online; 索引已创建。

    2.oracle显示执行计划   (1) EXPLAIN PLAN FOR SELECT * FROM a;

(2)  set autotrace on

select * from a;

QL>SET TIMING ON             --控制显示执行时间统计数据

SQL>SET AUTOTRACE ON EXPLAIN       --这样设置包含执行计划、脚本数据输出,没有统计信息

SQL>执行需要查看执行计划的SQL语句

SQL>SET AUTOTRACE OFF           --不生成AUTOTRACE报告,这是缺省模式

SQL> SET AUTOTRACE ON           --这样设置包含执行计划、统计信息、以及脚本数据输出

SQL>执行需要查看执行计划的SQL语句

SQL>SET AUTOTRACE OFF

SQL> SET AUTOTRACE TRACEONLY      --这样设置会有执行计划、统计信息,不会有脚本数据输出

SQL>执行需要查看执行计划的SQL语句

SQL>SET AUTOTRACE TRACEONLY STAT     --这样设置只包含有统计信息

SQL>执行需要查看执行计划的SQL语句

  3.创建唯一索引:

在departments表中创建departments_name列上的一个唯一性索引

SQL> create unique index dep_dname_unique on departments(departments_name)
2 storage(initial 10k next 10k pctincrease 75)
3 tablespace users; 索引已创建。

  4.在student表上创建的sex上创建一个位图索引

SQL> create bitmap index student_sex_bitmap on student(sex) tablespace users;

索引已创建。

  5.创建反序索引

为employees表的manager_id列创建一个反序索引

SQL> create index emp_magid_reverse on employees(manager_id) reverse tablespace users;

索引已创建。

  6.创建函数索引:为了提高查询条件中使用函数或者表达式的查询语句的执行速度,可以创建函数索引。

基于employees表的first_name列创建一个函数索引

SQL> create index emp_fname_indx on employees(upper(first_name)) tablespace user
s; 索引已创建。

Oracle索引(1)概述与创建索引的更多相关文章

  1. Oracle性能分析7:创建索引

    在创建索引时,我们往往希望可以预估索引大小,以评估对现有project环境的影响,我们也希望创建索引的过程可以最小化的影响我们正在执行的project环境,并能查看索引的状况. 预估索引大小 预估索引 ...

  2. oracle的约束隐式创建索引和先索引后约束的区别

    oracle的约束隐式创建索引和先索引后约束的区别 两种情况:1.对于创建约束时隐式创建的索引,在做删除操作的时候: 9i~11g都会连带删除该索引 2.对于先创建索引,再创建约束(使用到此索引)这种 ...

  3. oracle数据库什么情况下创建索引比较好

    索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽 然说,在表中 ...

  4. Oracle 查看链接数、创建索引等的DDL语句

    select count(*),machine from v$session group by machine 今天打算将一个数据库的索引在另一个测试库上重新创建一遍,研究了一下. set pages ...

  5. oracle 创建索引

    一.索引简介 1.索引相当于目录 2.索引是通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率. 3.索引的创建要适度,多了会影响增删改的效率,少了会影响查询的效率,索引最好创建在取 ...

  6. oracle创建索引表空间

    Oracle 的索引可分为5种,它们包括唯一索引.组合索引.反向键索引.位图索引和基于函数的索引.1.创建索引的标准语法CREATE INDEX 索引名 ON 表名 (列名)TABLESPACE 表空 ...

  7. Oracle创建索引的原则(转)

    Oracle 建立索引及SQL优化 数据库索引: 索引有单列索引复合索引之说 如何某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问 ...

  8. oracle创建索引

    数据库索引是为了提高查询速度的一种数据结构. 索引的创建语句 索引的创建语句非常简单. CREATE INDEX 索引名 ON 表名(列名); 除了单列索引,还可以创建包含多个列的复合索引. CREA ...

  9. ORACLE中关于外键缺少索引的探讨和总结

    在ORACLE数据库中,定义外键约束时,ORACLE是不会自动创建对应索引的,必须手动在外键约束相关的列上创建索引.那么外键字段上是否有必要创建索引呢?如果有必要的话,巡检时,如何找出外键字段上没有创 ...

随机推荐

  1. ubi实际使用

    ubifs号称性能比yaffs2 好,同时压缩可读写,文件系统image体较小同时可写.1. uboot使能对UBIFS的支持#define CONFIG_CMD_NAND#define CONFIG ...

  2. Power Network - poj 1459 (最大流 Edmonds-Karp算法)

      Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24788   Accepted: 12922 Description A ...

  3. JavaBean属性

    一个JavaBean对象的属性应该是可访问的.这个属性可以是任意合法的Java数据类型,包括自定义Java类. 一个JavaBean对象的属性可以是可读写,或只读,或只写.JavaBean对象的属性通 ...

  4. JNDI提供了一种统一的方式,可以用在网络上查找和访问服务

    JNDI提供了一种统一的方式,可以用在网络上查找和访问服务.通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回数据库连接建立所必须的信息. JNDI主要有两部分组成:应用程序编程 ...

  5. linux oracle sqlplus中文乱码解决

    在oracle用户的~/.bash_profile中添加 NLS_LANG="SIMPLIFIED CHINESE"_CHINA.ZHS16GBKexport NLS_LANG 然 ...

  6. JAVA的protected权限

    1.派生类能够訪问父类的protected数据.这是毫无疑问的. 2.今天做Think in java的习题发现,同一个包内的一个类调用还有一个类的protected数据是能够的.代码例如以下: pa ...

  7. 移动web开发经验总结(转)

    1.<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-sca ...

  8. [ JS 进阶 ] 基本类型 引用类型 简单赋值 对象引用 (转)

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两 ...

  9. lumen 事件

    今天需要实现日志功能,所有使用了一下lumen的event(事件)和listener(监听) Lumen事件:https://lumen.laravel-china.org/docs/5.3/even ...

  10. &quot;围观&quot;设计模式(7)--创建型之单例模式(Singleton Pattern)

    单例模式,也叫单子模式,是一种经常使用的软件设计模式.在应用这个模式时,单例对象的类必须保证仅仅有一个实例存在. 很多时候整个系统仅仅须要拥有一个的全局对象.这样有利于我们协调系统总体的行为.比方在某 ...