Oracle索引

       索引,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

      在数据库系统中建立索引主要有以下作用

1)快速取数据;

2)保证数据记录的唯一性;

3)实现表与表之间的参照完整性;

4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间

      创建oracle有效索引规则:

1、如果需要访问的数据不超过4%或5%,则可以使用索引。访问表中的行数据的另一种方法是从头到尾的顺序读取整个表,这称为全表扫描。全表扫描适用于请求的数据占全表数据百分比较高的查询。

2、相对较小的表应避免使用索引;

3、为所有表创建主键。在指定一列作为主键时,oracle自动创建该列索引;

4、对在where字句中频繁使用的列建立主键;

5、对包括在orader by 和group by 操作的列或涉及排序的union和distinct等其他操作中的列建立索引。由于索引已经被排序,因此执行前述操作的排序要求将显著减少;

6、只对有高选择性的表建立索引。既选择对几乎没有相同值得表建立索引

7、被频繁更改的列由于涉及开销问题,理论上不索引

8、如果一个表很大,建立索引的时间很长,因为建立索引也会产生大量的redo信息,所以在创建索引时可以设置不产生或少产生redo信息。只要表数据存在,索引失败了大不了再建,所以可以不需要产生redo信息。

特殊类型索引:

1、位图索引

位图索引使用位图标识被索引的列值,该索引通常不适于有大量更新任务的表,但很适合数据仓库的应用。位图索引由表示索引中每列一个字位的流(0或1)组成

B-树索引 位图索引

适用高基数的数据

适于OLTP数据库

使用大量的空间

易于更新

适于低基数的数据

适于数据仓库应用

使用的空间相对少

难于更新

创建位图索引:

          SQL>create bitmap index gender_idx on employee_gender) tablespace dbs1;

监控索引的使用

oracle提供explain plan和sql trace工具,通过使用explain plan的输出或sql trace的结果查看查询的执行路径并确定索引是否被使用。oracle还提供一个更容易的监控数据库中索引是否被使用的方法,具体操作方法如下。
为开始监控索引的使用,以p_key_sales索引拥有者的身份登录,并执行下列语句:
SQL> alter index p_key_sales monitoring usage;
        index altered.
现在,在sales上运行某些查询,使用以下命令终止监控活动
SQL> alter index p_key_sales nomonitoring usage;
        index altered.
现再,可以查询v$object_usage字典视图来查找p_key_sales索引是否被使用
SQL>select * from v$object_usage where index_name='P_KEY_SALES';
   在输出结果中,oracle在used列中为yes值,表示所关注的索引已被数据库使用
如何判断索引需要重建



1. analyze index your_index_name validate structure;
2. 查询索引碎片:
select name,
           del_lf_rows,
           lf_rows,
           round((del_lf_rows/(lf_rows+0.0000000001))*100) frag_pct
   from index_stats
    一般如果该索引的frag_pct>10%,那么就需要rebuild index

查看索引统计信息:

select t.index_name, t.distinct_keys, t.num_rows, t.sample_size, t.last_analyzed 
      , t.blevel, t.leaf_blocks, t.* 
from user_indexes t 
where t.table_name = upper('t_product');
 

使用索引查询一定能提高查询的性能吗?举出实例

不能,

索引就是一种特殊的查询表 数据库的搜索引擎可以利用它加速对数据的检索
就像书的目录 不需要查询整本书就可以找到想要的数据
优点:
   加快访问速度 加强唯一性
缺点:
    带索引的表在数据库中需更多的存储空间
    操作数据的命令需更长时间 因为需要对索引更新

原文地址:https://www.cnblogs.com/shuihuaboke/p/4721592.html