PL/SQL

PL/SQL 知识量:16 - 57 - 244

8.1 索引的创建><

什么是索引- 8.1.1 -

在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据。索引是某个表中一列或者若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据存储位置的指针。

索引虽然针对表中的数据,但它们通常会独立地存在而不是和表在一起。

数据库中索引的作用主要有:

  • 通过创建唯一索引,可以保证数据记录的唯一性。

  • 可以大大加快数据检索速度。

  • 可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。

  • 在使用ORDER BY和GROUP BY子句进行检索数据时,可以显著减少查询中分组和排序的时间。

  • 使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。

索引的种类及语法- 8.1.2 -

在Oracle数据库中提供了多种索引:

  • B-Tree索引:B-Tree Index,是Oracle中默认的和最常用的一种索引,可以使用它来检索由索引列排序的数据,也就是通常所见的唯一索引、聚簇索引等。

  • 位图索引:Bitmap Index,使用位图来管理与数据行的对应关系,主要用在联机数据分析方面,它更适合低基数的数据,也就是数据差异比较小的列。需要注意的是,该索引针对那些数据不经常改动的字段。

  • 基于函数的索引:Function-based Index,这种索引使用数据列基于函数返回的值,在Oracle 8i以后得到支持,它会在“SELECT * FROM table_name WHERE function(col) =value”类型语句当中起作用。

  • 反向键索引:Reverse Key Index,如果主键值按一定顺序增加,那么索引树的层级会增长很快。为了避免这种情况,使用了反向键索引这种方式,它对B-Tree索引码中的字节进行了反转,这样就使得索引树分配更均匀,有效地减少了索引叶的竞争。

建立索引的语句是CREATE INDEX,语法格式如下:

CREATE [UNIQUE|BITMAP] INDEX [schema.]index_name
ON [schema.]table_name [tbl_alias]
(col [ASC | DESC])

简要说明:

  • CREATE:表示创建。

  • INDEX:创建索引的关键词。

  • UNIQUE:表示唯一索引。

  • BITMAP:表示位图索引。

  • schema:模式名称。

  • index_name:索引名称,它在表或视图中必须唯一。

  • ON:关键词,表示作用对象。

  • table_name:表名。

  • tbl_alias:表的别名,可选。

  • col:列名。为索引所基于的一列或多列。

  • ASC | DESC:确定特定索引列的升序或降序排序方向,默认值为ASC。

唯一索引的创建- 8.1.3 -

在PL/SQL中,可以使用CREATE INDEX语句来创建唯一索引。以下是一个创建唯一索引的示例:

DECLARE  
  index_name VARCHAR2(30);  
BEGIN  
  -- 生成唯一索引名称  
  index_name := 'IDX_UNIQUE_' || TO_CHAR(SYSDATE, 'YYYYMMDD');  
  
  -- 创建唯一索引  
  EXECUTE IMMEDIATE 'CREATE UNIQUE INDEX ' || index_name || ' ON table_name (column_name)';  
EXCEPTION  
  WHEN OTHERS THEN  
    -- 处理异常  
    DBMS_OUTPUT.PUT_LINE('Error creating unique index: ' || SQLERRM);  
END;  
/

在上面的示例中,需要将table_name替换为要创建索引的表名,column_name替换为要创建索引的列名。index_name变量用于生成唯一索引名称,这里使用当前日期作为后缀来确保唯一性。

注意:上述示例使用了动态SQL语句EXECUTE IMMEDIATE来执行创建索引的操作。这是为了确保可以动态生成索引名称并避免预先编写大量的索引名称。当然,可以根据实际情况选择静态索引名称,省略变量和动态SQL部分。

此外,还添加了一个异常处理块来处理创建索引时可能发生的异常情况。在这种情况下,可以选择记录错误消息并采取适当的措施,例如回滚事务或重新尝试创建索引。

在创建唯一索引之前,应该仔细评估索引的需求和表的性能要求,并确保要创建索引的列具有唯一性约束或逻辑上的唯一性要求。

复合索引的创建- 8.1.4 -

在PL/SQL中,创建复合索引需要使用CREATE INDEX语句。以下是一个创建复合索引的示例:

DECLARE  
  index_name VARCHAR2(30);  
BEGIN  
  -- 生成唯一索引名称  
  index_name := 'IDX_COMPOSITE_' || TO_CHAR(SYSDATE, 'YYYYMMDD');  
  
  -- 创建复合索引  
  EXECUTE IMMEDIATE 'CREATE INDEX ' || index_name || ' ON table_name (column1, column2)';  
EXCEPTION  
  WHEN OTHERS THEN  
    -- 处理异常  
    DBMS_OUTPUT.PUT_LINE('Error creating composite index: ' || SQLERRM);  
END;  
/

在上面的示例中,需要将table_name替换为要创建索引的表名,column1和column2替换为要创建索引的列名。index_name变量用于生成唯一索引名称,这里使用当前日期作为后缀来确保唯一性。

在CREATE INDEX语句中,通过指定多个列名来创建复合索引。这样可以在查询中同时使用这些列的索引,以提高查询性能。

注意:创建索引是一个资源密集的操作,特别是对于大型表。在创建复合索引之前,建议评估表的性能要求和查询模式,并确定索引的正确列组合。过多的索引可能会对数据库性能产生负面影响,因此需要根据具体情况进行权衡和测试。

此外,复合索引对于查询的列顺序和使用的索引列的顺序是有敏感的。在查询中,如果使用复合索引的前导列进行过滤,则该索引将非常有用。如果查询使用了复合索引的非前导列,或者查询条件与索引列不匹配,则索引可能不会被有效使用。因此,在创建复合索引时,需要仔细分析查询需求并确定正确的列顺序。

创建索引的注意事项- 8.1.5 -

在PL/SQL中创建索引时,需要注意以下几点:

  • 确定索引列:选择经常用于查询的列作为索引列,以加速查询性能。

  • 考虑表的更新频率:如果表经常被更新,过多的索引可能会影响插入、更新和删除操作的性能。

  • 避免冗余索引:不要在相同的列上创建多个索引,以避免浪费资源并降低性能。

  • 慎重使用复合索引:复合索引可以提高多列查询的性能,但需要注意列的顺序以及查询条件是否与索引匹配。

  • 定期维护索引:定期对索引进行优化和维护,以保证其性能和有效性。

  • 测试性能:在创建索引之后,需要测试其性能,以确保索引的正确性和有效性。

  • 注意数据类型:在创建索引时,需要选择合适的数据类型,以确保索引的准确性、唯一性和稳定性。

  • 控制索引数量:过多的索引会降低数据库的写性能,因此只需要在必要的列上创建索引即可。

  • 选择正确的算法:在创建索引时,需要选择正确的算法以适应用户的查询需求。

  • 注意NULL值:如果表中的某个列包含NULL值,需要决定是否在索引中包含这些NULL值,这可能会影响索引的性能和大小。

创建索引是一个需要慎重考虑的过程,需要结合具体的业务需求、表结构和查询模式来决定。在创建索引时,需要平衡好查询性能和更新效率,避免冗余索引和无效的索引,以保证数据库的整体性能。