暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【达梦8】索引的管理

原创 李美静 恩墨学院 2021-09-24
1451

本文主要介绍在达梦8中索引的主要内容。

1 索引

DM8 提供了几种最常见类型的索引,对不同场景有不同的功能,它们是:

  1. 聚集索引:每一个普通表有且只有一个聚集索引;
  2. 唯一索引:索引数据根据索引键唯一;
  3. 函数索引:包含函数/表达式的预先计算的值;
  4. 位图索引:对低基数的列创建位图索引;
  5. 位图连接索引:针对两个或者多个表连接的位图索引,主要用于数据仓库中;
  6. 全文索引:在表的文本列上而建的索引。

2 索引正确的表和列

索引正确的表和列
使用下面的准则来决定何时创建索引:

  1. 如果需要经常地检索大表中的少量的行,就为查询键创建索引;
  2. 为了改善多个表的连接的性能,可为连接列创建索引;
  3. 主键和唯一键自动具有索引,在外键上很多情况下也创建索引;
  4. 小表不需要索引。
    选取表中的索引列时可以考虑以下几点:
  5. 列中的值相对比较唯一 ;
  6. 取值范围大,适合建立索引;
  7. CLOB 和 TEXT 只能建立全文索引、BLOB 不能建立任何索引。
    3 创建索引
CREATE INDEX emp_ename ON emp(ename)
STORAGE (
INITIAL 50,
NEXT 50,
ON USERS);

4 创建聚集索引

DM8 中表(列存储表和堆表除外)都是使用 B+树索引结构管理的,每一个普通表都有
且仅有一个聚集索引, 数据都通过聚集索引键排序, 根据聚集索引键可以快速查询任何记录。
当建表语句未指定聚集索引键时,DM8 的默认聚集索引键是 ROWID。若指定索引键,表中数据都会根据指定索引键排序。
建表后,DM8 也可以用创建新聚集索引的方式来重建表数据,并按新的聚集索引排序。
例如,可以对 emp 表以 ename 列新建聚集索引。

CREATE CLUSTER INDEX clus_emp_name ON emp(ename);

新建聚集索引会重建这个表以及其所有索引,包括二级索引、函数索引,是一个代价非常大的操作。因此,最好在建表时就确定聚集索引键,或在表中数据比较少时新建聚集索引,而尽量不要对数据量非常大的表建立聚集索引。
创建聚集索引的约束条件:

  1. 每张表中只允许有一个聚集索引,如果之前已经指定过 CLUSTER INDEX 或者指定了 CLUSTER PK,则用户新建立 CLUSTER INDEX 时系统会自动删除原先的聚集
    索引。但如果新建聚集索引时指定的创建方式(列,顺序)和之前的聚集索引一样,
    则会报错;
  2. 指定 CLUSTER INDEX 操作需要重建表上的所有索引,包括 PK 索引;
  3. 删除聚集索引时,缺省以 ROWID 排序,自动重建所有索引;
  4. 若聚集索引是默认的 ROWID 索引,不允许删除;
  5. 聚集索引不能应用到函数索引中;
  6. 垂直分区表在建表后不能更改聚集索引;如果建表时没有指定聚集索引,后续也不
    能再指定;
  7. 不能在列存储表上新建/删除聚集索引;
  8. 建聚集索引语句不能含有 partition_clause 子句;
  9. 在临时表上增删索引会使当前会话上临时 b 树数据丢失。
    5 创建唯一索引
    索引可以是唯一的或非唯一的。唯一索引可以保证表上不会有两行数据在键列上具有相同的值,非唯一索引不会在键列上施加这个限制。
    可用 CREATE UNIQUE INDEX 语句来创建唯一索引,如下例子创建一个唯一索引:
CREATE UNIQUE INDEX dept_unique_index ON dept (dname)
STORAGE (ON users);

6 创建函数索引

不支持集函数和不确定函数,不确定函数为每次执行得到的结果不确定,系统中不确定函数包括:RAND、SOUNDEX、CURDATE等,快速装载不支持含有函数索引的表。
位图索引具有以下约束:
支持普通表、堆表和水平分区表创建位图索引,不支持对大字段创建位图索引,不支持对计算表达式列创建,不支持在unique,primary key上创建,不支持对存在cluster key的表创建,mpp环境不支持,不支持快速装载。包含位图索引的表不支持并发的插入,删除和更新操作。

7 位图连接索引

创建位图连接索引
位图连接索引是一种提高通过连接实现海量数据查询效率的有效方式,主要用于数据仓库环境中。区别于上一节所说的建立在单表上的位图索引,位图连接索引是针对两个或者多个表的连接而建立的位图索引,同时保存了连接的位图结果。对于索引列中的每一个值,位图连接索引在索引表中保存了对应行的 ROWID。
如下例子创建一个位图连接索引

create bitmap index SALES_CUSTOMER_NAME_IDX
on SALES.SALESORDER_HEADER(SALES.CUSTOMER.PERSONID)
from SALES.CUSTOMER, SALES.SALESORDER_HEADER
where SALES.CUSTOMER.CUSTOMERID = SALES.SALESORDER_HEADER.CUSTOMERID;

8 索引重建

DM8 提供的重建索引的系统函数为:

SP_REBUILD_INDEX(SCHEMA_NAME varchar(256), INDEX_ID int);

水平分区子表,临时表和系统表上建的索引不支持重建
虚索引和聚集索引不支持重建

9 查看索引信息

创建索引后,可以通过 INDEXDEF 系统函数查看索引的定义。
INDEXDEF(INDEX_ID int, PREFLAG int);
INDEX_ID 为索引 ID,PREFLAG 表示返回信息中是否增加模式名前缀。
例如,需要查看索引 emp_name 的定义,假设其索引 ID 为 1547892,那么使用以下语句查看索引定义。

SELECT INDEXDEF(1547892, 0);
或 SELECT INDEXDEF(1547892, 1);

如果用户想获得索引更详细的信息,可以查询 SYSINDEXES 表;如果用户想了解存储
过程、函数等的定义信息,可以查询 SYSTEXTS 表;如果用户想了解更详细的约束的相关信息,可以查询 SYSCONS 表。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论