Loading [a11y]/accessibility-menu.js

Oracle索引类型

Oracle索引

1、索引的优点
    (1) 加快数据的 '检索速度'
    (2) 可以保证列值的 '唯一性'(unique、主键)
    (3) 实现表与表之间的 '参照完整性'(外键)
    (4) 在使用 order by、group by 子句时,可以减少排序和分组的时间   	
2、索引的缺点
    (1) 当对表数据进行 DML 操作的时候,索引自动维护,'降低 DML 操作的速度'
    (2) 索引需要占 '物理空间',同数据表的 '表空间' tablespace 一样
    (3) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
3、索引的使用原则
    (1) '主键' 和 '外键' 会自动创建索引,无需人工操作
    (2) 选择正确的表:经常检索包含大量数据的表中小于 15% 的行
    (3) 选择正确的列:多个表之间的关联关系
    (3) 合理安排索引列:(A,B,C) A 最常用,B 次之,C 最末
None
创建索引:
-- 语法:
create [unique | bitmap] index [schema.] 索引名 on [schema.] 表名 (列名1, .., 列名N);
 
1. 创建 '一般索引' ('B-Tree' 索引)
   create index schema.index_name on schema.tablename(col_name);
   create index schema.index_name on schema.tablename(col_name_1, col_name_2);
2. 创建 '位图索引'
   create bitmap index schema.bitmap_index_name on schema.tablename(col_name);

None
查询、修改、删除索引:
1. 查询索引
   select t.*
     from dba_indexes t
    where t.owner = 'USER_NAME'
      and t.table_name = 'TABLE_NAME';
2. 修改索引
   -- 修改索引名称 index_name -> index_name_new
   alter index schema.index_name rename to index_name_new;
   -- 修改索引为无效
   alter index schema.index_name unusable;
   -- 重建索引
   alter index schema.index_name rebuild online;
3. 删除索引
   drop index schema.index_name;
None

一、B-Tree索引

B-Tree 索引是Oracle 默认的索引类型,B 代表 “平衡(balanced)” 是一种树结构
一般使用于列的数据中,不同值的个数很多的情况,比如主键列、身份证号列等(值不相同、值个数多)

以下是B-Tree索引读取rowid=82的原理示意图:

image-1663399947039

二、位图索引

位图索引适用场景需满足两个条件:
1、位图索引列大量重复,不同值的个数很少,比如性别列,是否XX列
2、该表极少被更新

因为位图索引更新时,会把所有记录都锁住,其他会话无法对这些数据进行修改,大量的锁对多并发系统来说无法接受

示例:

姓名(Name) 性别(Gender) 身份证(ID_Card)
n1 371…
n2 372…
n3 371…
n4 372…
n5 372…
n10086 372…
位图索引原理:

如果在 性别(Gender) 列上建立了 位图索引,对于 性别(Gender) 这个列,针对每行的 rowid(rowid可以理解为每行的物理位置),位图索引形成两个向量:
男:10010, 女:01101
其中 1:表示男,0:表示女。

创建的位图索引如下:
Rowid 1 2 3 4 5 10086
1 0 0 1 0 0
0 1 1 0 1 1

三、函数索引

概念:

函数索引(Function-Based Indexes,FBI),它基于对表中列进行计算后的结果创建索引。

函数索引在不修改应用程序的逻辑基础上提高了查询性能。如果没有函数索引,那么任何在列上执行了函数的查询都不能使用这个列的索引。当在查询中包含该函数时,数据库才会使用该函数索引。

函数索引可以是一个B-Tree索引或位图索引。

使用:

任何对列的操作都可能导致全表扫描,例如:

select * from ac_table where substr(name,1,2) = 'X';
select * from ac_table where to_char(create_time,'yyyy-MM-dd') = '2022-09-17';
None

这时候可以创建函数索引:

create index ac_table_index_1 on ac_table ( substr(name,1,2) );
create index ac_table_index_2 on ac_table ( to_char(create_time,'yyyy-MM-dd') );
None

注意事项

  • 1、函数索引创建时要和使用时保持一致,创建时为:to_char(TIME, ‘yyyy-MM-dd’),查询时也需使用:to_char(TIME, ‘yyyy-MM-dd’),使用to_char(TIME, ‘YYYY’) 就会失效,任何不一致都会导致索引失效,其他函数同样。
  • 2、不建议使用自定义函数,如果被函数索引所用的自定义函数失效或该函数索引的属主没有了在函数索引里面使用的函数的执行权限,则会导致ORA-06575错误。
  • 3、创建函数索引的函数必须是确定性的。即,对于指定的输入,总是会有确定的结果。
  • 4、创建索引的函数不能使用SUM、COUNT等聚合函数。
  • 5、不能在LOB类型的列、NESTED TABLE列上创建函数索引。
  • 6、不能使用SYSDATE()、SYS_GUID()等非确定性函数。
  • 7、对于任何用户自定义函数必须显式声明DETERMINISTIC关键字,否则会导致ORA-30553:the funciton is not deterministic错误。
# oracle  索引 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×