达梦索引管理

达梦索引管理,全部参照官方文档。

  1. 索引是与表相关的可选的结构(聚簇索引除外),它能使对应于表的sql语句执行的更快。DM提供了几种类型的索引。聚集索引:每一个普通表有且仅有一个聚集索引;唯一索引:索引数据根据索引键唯一;函数索引:包含函数/表达式的预先计算的值;位图索引:对低基数的列创建位图索引;位图连接索引:针对两个或多个表连接的位图索引,主要用于数据仓库中(如:CREATE BITMAP INDEX IDX ON TEST1(TEST2.ID) FROM TEST1,TEST2 WHERE TEST1.ID = TEST2.ID; 没有用过,不清楚是个什么功能);全文索引:在表的文本列上建立的索引;
  2. 索引在逻辑上和物理上都与相关的表的数据无关,作为无关的结构,索引需要存储空间。创建或删除一个索引时,不会影响基表、数据库应用或其它索引;当插入、更改和删除相关的表的行时,DM会自动管理索引。
  3. 一般情况下,在插入或装载了数据后,为表创建索引会更加有效率,若在装在数据之前创建了一个或多个索引,那么在插入每行时,dm都必须更改和维护每个索引,使得插入效率降低。
  4. 使用下列准则来决定何时创建索引:若需要经常检索大表中的少量的行,就为查询键创建索引;为改善多个表的连接的性能,可以为连接列创建索引;主键和唯一键自动具有索引,在外键上很多情况下也创建索引;小表不需要索引。
  5. 选取表中的索引列时可以考虑以下几点:列中的值相对比较唯一;取值范围大,适合建立索引;CLOB和TEXT只能建立全文索引,BLOB不能建立任何索引。
  6. 在CREATE INDEX语句中列的排序会影响查询的性能,通常将最常用的列放在最前面;若查询中有多个字段组合定位,则不应为每个字段单独创建索引,而应该创建一个组合索引;当两个或多个字段都是等值查询时,组合索引中各个列的前后关系是无关紧要的,但若是非等值查询时,要想有效利用组合索引,则应该按等值字段在前,非等值字段在后的原则,查询时只能利用一个非等值的字段;
  7. 一个表上可以有任意数量的索引,但是,索引越多,修改表数据的开销就越大。
  8. 创建聚集索引:CREATE CLUSTER INDEX...; 新建聚集索引会重建这个表以及其所有索引,包括二级索引、函数索引,是一个代价非常大的操作,因此最好在建表时就确定聚集索引键,或在表中数据比较少时新建聚集索引。
  9. 创建聚集索引的约束条件:每张表中只允许有一个聚集索引,若之前已经指定了CLUSTER INDEX或CLUSTER PK,则用户新建立CLUSTER INDEX时系统会自动删除原先的聚集索引,但若新建聚集索引时指定的创建方式(列、顺序)和之前的聚集索引一样,则会报错;指定CLUSTER INDEX操作需要重建表上的所有索引,包括PK索引;删除聚集索引时,缺省以ROWID排序,自动重建所有索引;若聚集索引是默认的ROWID索引,则不允许删除;聚集索引不能应用到函数索引中;不能在列存表上创建/删除聚集索引;建聚集索引语句不能含有partition_clause子句;在临时表上增删索引会导致当前会话上临时b树数据丢失。
  10. 创建唯一索引:CREATE UNIQUE INDEX...; 另外DM通过在唯一键或主键上创建一个唯一索引来在该表上实施UNIQUE KEY或PRIMARY KEY完整性约束。如:ALTER TABLE TEST ADD CONSTRAINT CON_PK PRIMARY KEY (ID); ALTER TABLE TEST ADD CONSTRAINT CON_UNI UNIQUE (ID);
  11. 创建函数索引有以下约束条件:函数索引表达式可以由多列组成,不同的列不能超过63个;函数索引表达式里面不允许出现大字段和时间间隔类型列;不支持建立分区函数索引;函数索引表达式的长度理论值不能超过816个字符(包括生成后的指令和字符串);函数索引不能为CLUSTER或PRIMARY KEY类型;表达式不支持基函数和不确定函数;快速装载不支持含有函数索引的表;当表中含有行前触发器并且该触发器会修改函数索引涉及的列的值时,不能建立函数索引;若函数索引中要使用用户自定义的函数,则函数必须是指定了DETERMINISTIC属性的确定性函数;若函数索引中使用的确定性函数发生了变更或删除,用户需手动重建函数索引;若函数索引中使用的确定性函数内有不确定因素,会导致前后计算结果不同的情况。
  12. 位图索引主要针对含有大量相同值的列而创建,且执行查询语句的where子句中带有AND和OR谓词时,效果更明显。语法:CREATE BITMAP INDEX...; 位图索引具有以下约束:支持普通表、堆表和水平分区表创建位图索引;不支持对大字段创建位图索引;不支持对计算表达式列创建位图索引;不支持在UNIQUE和PRIMARY KEY上创建位图索引;不支持对存在CLUSTER KEY的表创建位图索引;仅支持单列或者不超过63个组合列上创建位图索引;MPP环境下不支持创建位图索引;不支持快速装载含有位图索引的表;不支持全局位图索引;包含位图索引的表不支持并发的插入、删除和更新操作。
  13. 位图连接索引区别于位图索引,是针对两个或者多个表的连接而建立的位图索引,同时保存了连接的位图结果。对于索引列中的每一个值,位图连接索引在索引表中保存了对应行的ROWID。
  14. 当一个表经过大量的增删改操作后,表的数据在物理文件中可能存在大量的碎片,从而影响访问速度。另外当删除表的大量数据后,若不再对表执行插入操作,索引所处的段可能占用了大量并不使用的簇,从而浪费了存储空间。可以使用重建索引来对索引的数据进行重组,使数据更加紧凑,并释放不需要的空间,从而提高访问效率和空间利用率,语法为:SP_REBUILD_INDEX(‘SCH_NAME’,索引id); 水平分区子表、临时表和系统表上的索引不支持重建;虚索引(只查到了oracle虚拟索引怎么创建,DM中怎么创建虚索引还不清楚)和聚集索引不支持重建。
  15. 索引删除之后,该索引的段的所有簇都返回给包含它的表空间,并可用于表空间中的其他对象。如何删除索引,取决于是否是用CREATE INDEX语句明确的创建该索引的,是则可以使用DROP INDEX语句删除;然而不能直接删除与已启用的UNIQUE KEY或PRIMARY KEY键约束相关的索引,要删除一个与约束相关的索引,必须停用或删除该约束本身,如:ALTER TABLE TEST DROP CONSTRAINT PK_TEST; 除了删除普通索引,DM还提供删除聚集索引,只要其聚集索引是通过CREATE CLUSTER INDEX明确建立的。删除聚集索引其实是使用ROWID作为索引列重建聚集索引,和新建聚集索引一样会重建这个表及其所有索引列;删除表就自动删除了所有与其相关的索引。
  16. 创建索引后,可以通过INDEXDEF系统函数查看索引的定义:SELECT INDEXDEF(索引id,PREFLAG INT);其中PREFLAG表示返回信息中是否增加模式名前缀,为1表示加,为0不加。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值