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

达梦数据库索引管理方法详细介绍

原创 始于脚下 2021-11-15
7691

索引的创建

要在用户自己的模式中创建索引,至少要满足如下条件之一:

1. 要被索引的表是在自己的模式中 ;

2. 在要被索引的表上有 CREATE INDEX 权限;

3. 具有 CREATE ANY INDEX 数据库权限。

要在其他模式中创建索引,用户必须具有 CREATE ANY INDEX 数据库权限。

达梦数据库索引创建定义如下:

CREATE [OR REPLACE] [CLUSTER|NOT PARTIAL][UNIQUE | BITMAP| SPATIAL] INDEX <

索引名>

ON [<模式名>.]<表名>(<索引列定义>{,<索引列定义>}) [GLOBAL] [<STORAGE 子句>]

[NOSORT] [ONLINE];

<索引列定义>::= <索引列表达式>[ASC|DESC]

<STORAGE 子句>::=<STORAGE 子句 1>|<STORAGE 子句 2>

<STORAGE 子句 1>::= STORAGE(<STORAGE1 项> {,<STORAGE1 项>})

<STORAGE1 项> ::=

[INITIAL <初始簇数目>] |

[NEXT <下次分配簇数目>] |

[MINEXTENTS <最小保留簇数目>] |

[ON <表空间名>] |

[FILLFACTOR <填充比例>]|

[BRANCH <BRANCH 数>]|

[BRANCH (<BRANCH 数>, <NOBRANCH 数>)]|

[NOBRANCH ]|

[<CLUSTERBTR>]|

[SECTION (<区数>)]|

[STAT NONE]

<STORAGE 子句 2>::= STORAGE(<STORAGE2 项> {,<STORAGE2 项>})

<STORAGE2 项> ::= [ON <表空间名>]|[STAT NONE]

参数

1. UNIQUE 指明该索引为唯一索引;

2. BITMAP 指明该索引为位图索引;

3. SPATIAL 指明该索引为空间索引;

4. CLUSTER 指明该索引为聚簇索引(也叫聚集索引),不能应用到函数索引中;

5. NOT PARTIAL 指明该索引为非聚簇索引,缺省即为非聚簇索引;

6. <索引名> 指明被创建索引的名称,索引名称最大长度128字节;

7. <模式名> 指明被创建索引的基表属于哪个模式,缺省为当前模式;

8. <表名> 指明被创建索引的基表的名称;

9. <索引列定义> 指明创建索引的列定义。其中空间索引列的数据类型必须是DMGEO

包内的空间类型,如ST_GEOMETRY等;

10. <索引列表达式> 指明被创建的索引列可以为表达式;

11. GLOBAL 指明该索引为全局索引,仅堆表的水平分区表支持该选项,非水平分区表忽略该选项。 堆表上的PRIMARY KEY会自动变为全局索引;

12. ASC 递增顺序;

13. DESC 递减顺序;

14. <STORAGE子句> 普通表的索引参考<STORAGE子句1>, HUGE表的索引参考<STORAGE子句2>;

15. <STORAGE子句1>中, BRANCH和NOBRANCH只能用以指定聚集索引;

16. NOSORT 指明该索引相关的列已按照索引中指定的顺序有序,不需要在建索引时排序,提高建索引的效率。若数据非有序却指定了NOSORT,则在建索引时会报错;

17. ONLINE 表示支持异步索引,即创建索引过程中可以对索引依赖的表做增、删、改操作。


索引重建

当一个表经过大量的增删改操作后,表的数据在物理文件中可能存在大量碎片,从而影响访问速度。另外,当删除表的大量数据后,若不再对表执行插入操作,索引所处的段可能占用了大量并不使用的簇,从而浪费了存储空间。

可以使用重建索引来对索引的数据进行重组,使数据更加紧凑,并释放不需要的空间,从而提高访问效率和空间效率。 DM8 提供的重建索引的系统函数为:

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

SCHEAM_NAME 为索引所在的模式名, INDEX_ID 为索引 ID。

使用说明:

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

2. 虚索引和聚集索引不支持重建

例如,需要重建索引 ind_emp_name,假设其索引ID为 123456,那么使用以下语句重建索引:

SP_REBUILD_INDEX('DMHR', 123456);

索引的删除

要想删除索引,则该索引必须包含在用户的模式中或用户必须具有 DROP ANY INDEX数据库权限。索引删除之后, 该索引的段的所有簇都返回给包含它的表空间,并可用于表空间中的其他对象。

如何删除索引,取决于是否是用 CREATE INDEX 语句明确地创建该索引的,是则可以用 DROP INDEX 语句删除该索引。如下面的语句删除 ind_emp_ename 索引。

DROP INDEX ind_emp_ename;

然而,不能直接删除与已启用的 UNIQUE KEY 键或 PRIMARY KEY 键约束相关的索引。要删除一个与约束相关的索引,必须停用或删除该约束本身。如下面的语句删除主键约束

pk_emp_name,同时删除其对应的索引。

ALTER TABLE emp DROP CONSTRAINT pk_emp_name;

除了删除普通索引, DM8 还提供删除聚集索引,只要其聚集索引是通过 CREATE CLUSTER INDEX 明确建立的。

例如,下面的语句删除 emp 表的聚集索引 clu_emp_name。

DROP INDEX clu_emp_name;

删除聚集索引其实是使用 ROWID 作为索引列重建聚集索引,即跟新建聚集索引一样会重建这个表以及其所有索引。

删除表就自动删除了所有与其相关的索引。

索引信息管理

创建索引后,可以通过 INDEXDEF 系统函数查看索引的定义。

INDEXDEF(INDEX_ID int, PREFLAG int);

INDEX_ID 为索引 ID, PREFLAG 表示返回信息中是否增加模式名前缀。例如,需要查看索引 ind_emp_name 的定义,假设其索引 ID 为 123456,那么使用以下语句查看索引定义。

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

索引创建注意事项

达梦数据库创建索引注意事项:

1. <索引名>不得与该模式中其它索引的名字相同;

2. 索引列不得重复出现且数据类型不得为多媒体数据类型、类类型和自定义类型;

3. 索引列最多不能超过63列;

4. 可以使用STORAGE子句指定索引的存储信息, 它的参数说明参见CREATE TABLE语句;

5. 索引的默认表空间与其基表的表空间一致;

6. 索引的模式名与其基表的模式名一致;

7. 索引各字段值相加得到的记录内总数据值长度不得超过页大小的1/4,二级索引各字段值相加得到的记录内总数据值长度则不能超过min(页大小1/4 , 3000);

8. 每张表中只允许有一个聚集索引,如果之前已经指定过CLUSTER INDEX或者指定了CLUSTER PK,则用户新建立CLUSTER INDEX时系统会自动删除原先的聚集索引。但如果新建聚集索引时指定的创建方式(列,顺序)和之前的聚集索引一样,则会报错;

9. 列存储表(HUGE表)和堆表不允许建立聚集索引;

10. 指定CLUSTER INDEX操作需要重建表上的所有索引,包括PK索引;

11. 删除聚集索引时,缺省以ROWID排序,自动重建所有索引;

12. 本地索引:其分区方式与其所在基础表的分区方式一模一样的索引。本地索引的每个分区仅对应于其所在基础表的一个分区;

13. 函数索引:创建方式与普通索引一样,并且支持UNIQUE和STORAGE设置项,对于以表达式为过滤的查询,创建合适的函数索引会提升查询效率;

函数索引具有以下约束:

1) 表达式可以由多列组成,不同的列不能超过 63 个;

2) 表达式里面不允许出现大字段和时间间隔类型列;

3) 不支持建立分区函数索引;

4) 函数索引表达式的长度理论值不能超过 816 个字符(包括生成后的指令和字

符串);

5) 函数索引不能为 CLUSTER 或 PRIMARY KEY 类型;

6) 表达式不支持集函数和不确定函数,不确定函数为每次执行得到的结果不确

定,系统中不确定函数包括: RAND、 SOUNDEX、 CURDATE、 CURTIME、CURRENT_DATE、 CURRENT_TIME、 CURRENT_TIMESTAMP、 GETDATE、 NOW、

SYSDATE、 CUR_DATABASE、 DBID、 EXTENT、 PAGE、 SESSID、 UID、 USER、

VSIZE、 SET_TABLE_OPTION、 SET_INDEX_OPTION、 UNLOCK_LOGIN、

CHECK_LOGIN、 GET_AUDIT、 CFALGORITHMSENCRYPT、

SF_MAC_LABEL_TO_CHAR、 CFALGORITHMSDECRYPT、

BFALGORITHMSENCRYPT、 SF_MAC_LABEL_FROM_CHAR、

BFALGORITHMSDECRYPT、 SF_MAC_LABEL_CMP;

7) 快速装载不支持含有函数索引的表;

8) 当表中含有行前触发器并且该触发器会修改函数索引涉及列的值时,不能建立函数索引;

9) 若 函 数 索 引 中 要 使 用 用 户 自 定 义 的 函 数 , 则 函 数 必 须 是 指 定 了DETERMINISTIC 属性的确定性函数;

10) 若函数索引中使用的确定性函数发生了变更或删除,用户需手动重建函数索引;

11) 若函数索引中使用的确定性函数内有不确定因素,会导致前后计算结果不同的情况。在查询使用函数索引时,使用数据插入函数索引时的计算结果为 KEY值; 修改时可能会导致在使用函数索引过程中出现根据聚集索引无法在函数索引中找到相应记录的情况,对此进行报错处理;

12) MPP 环境下不支持函数索引的创建。

14. 在水平分区表中建立唯一索引,分区键必须都包含在索引键中;不能对水平分区表建立唯一函数索引;不能对水平分区子表单独建立索引;

15. 非聚集索引和聚集索引不能使用OR REPLACE选项互相转换;

16. 位图索引:创建方式和普通索引一致, 对低基数的列创建位图索引,能够有效提高,基于该列的查询效率,位图索引具有以下约束:

1) 支持普通表、 堆表和水平分区表创建位图索引;

2) 不支持对大字段创建位图索引;

3) 不支持对计算表达式列创建位图索引;

4) 不支持在 UNIQUE 列和 PRIMARY KEY 上创建位图索引;

5) 不支持对存在 CLUSTER KEY 的表创建位图索引;

6) 仅支持单列或者不超过 63 个组合列上创建位图索引;

7) MPP 环境下不支持位图索引的创建;

8) 不支持快速装载建有位图索引的表;

9) 不支持全局位图索引;

10) 包含位图索引的表不支持并发的插入、删除和更新操作。

17. NOSORT不支持与[OR REPLACE]、 [CLUSTER]、 [BITMAP]、 [ONLINE]同用;

18. ONLINE选项具有以下约束:

1) 不支持与[OR REPLACE]、 [CLUSTER]、 [BITMAP]同用;

2) 不支持 MPP 环境;

3) 暂不支持列存储表创建索引时指定 ONLINE 选项;

4) 建立 PRIMARY KEY, UNIQUE 约束时,隐式创建的索引不支持 ONLINE 选项;

5) 函数索引支持 ONLINE 选项。

19. 空间索引: 创建时需指定SPATIAL关键字,删除方式和普通索引一样。 只能在DMGEO包内的空间类型的列上创建,如果使用DMGEO包内的空间位置进行查询时,使用空间索引能够提高查询效率。空间索引具有以下约束:

1) 只支持在空间类型列上创建;

2) 不支持使用 ONLINE 选项异步方式创建;

3) 不支持在水平分区表上创建空间索引;

4) 不支持在 MPP 环境和复制环境下创建空间索引;

5) 空间索引不支持组合索引,只能在一个列上创建;

6) 不支持在 4K 的页上建立空间索引。

 

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

评论