达梦(DM)数据库表索引

达梦DM数据库表索引

  • 表索引
    • 索引准则
      • 其他准则
    • 创建索引
      • 显式地创建索引
      • 其他创建索引语句
    • 使用索引
      • 重建索引
      • 删除索引

表索引

达梦数据库表索引相关内容比较多,常用的可能也就固定的一些,这里主要说一下常用的索引,从物理存储角度进行分类,可分为聚集索引和非聚集索引

非聚集索引(又称为二级索引、辅助索引):将二级索引列和聚集索引列共同存储在 B+ 树叶子节点上。如果查找非聚集索引键值或聚集索引键值可直接在 B+ 树中找到;如果查找索引键值以外的数据,则需要回到一级索引中进行查找。每一个表可以有多个非聚集索引。

下面举个例子说明一下,创建表并插入数据

--创建表格T1,并插入数据。
CREATE TABLE T1 (ID int,NAME varchar(20),DEPARTMENT varchar(20));
INSERT INTO T1 VALUES(1'Zhang San', 'A部');
INSERT INTO T1 VALUES(2'Li Si', 'B部');
INSERT INTO T1 VALUES(3'Wang Wu', 'C部');
INSERT INTO T1 VALUES(4'Chen Liu', 'D部');

查看表结构

SP_TABLEDEF('SYSDBA','T1');

在这里插入图片描述
创建索引后查看表结构

--创建聚集索引,索引键为ID。
CREATE CLUSTER INDEX C1 on T1(ID);
--创建非聚集索引,索引键为NAME。
CREATE INDEX S1 on T1(NAME);
SP_TABLEDEF('SYSDBA','T1');

在这里插入图片描述
使用聚集索引查找

--使用聚集索引进行查找
EXPLAIN SELECT * FROM  T1 WHERE ID=2;

在这里插入图片描述
使用非聚集索引查找

EXPLAIN SELECT ID FROM  T1 WHERE NAME='Wang Wu';

在这里插入图片描述
先使用非聚集索引进行查找,再通过非聚集索引关联上聚集索引进行二次查找

EXPLAIN SELECT * FROM  T1 WHERE NAME='Chen Liu';

在这里插入图片描述
一般情况下,在插入或装载了数据后,为表创建索引会更加有效率。如果在装载数据之前创建了一个或多个索引,那么在插入每行时 DM8 都必须更改和维护每个索引,使得插入效率降低

索引准则

包括以下准则:

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

其他准则

如果查询中有多个字段组合定位,则不应为每个字段单独创建索引,而应该创建一个组合索引。当两个或多个字段都是等值查询时,组合索引中各个列的前后关系是无关紧要的。但是如果是非等值查询时,要想有效利用组合索引,则应该按等值字段在前,非等值字段在后的原则创建组合索引,查询时只能利用一个非等值的字段。
一个表可以有任意数量的索引。但是,索引越多,修改表数据的开销就越大,因此索引不是越多越好,而应该适当。

创建索引

显式地创建索引

可以用 CREATE INDEX 语句显式地创建索引

CREATE INDEX idx_deptid ON test1(dept_id);

在这里插入图片描述
创建索引时未指定表空间的话,默认与表在相同的表空间下
在这里插入图片描述
指定存储设置及表空间创建索引

--指定表空间
CREATE INDEX idx_user ON test1(user_name) STORAGE ( INITIAL 50, NEXT 50, ON TEST2023);

在这里插入图片描述
查看指定的表空间索引
在这里插入图片描述
说明:

如果表及其索引使用相同的表空间 能更方便地对数据库进行管理(如表空间或文件备份)或保证应用的可用性,因为所有有关的数据总是在一起联机。然而,将表及其索引放在不同的表空间(在不同磁盘上)产生的性能比放在相同的表空间更好,因为这样做减少了磁盘竞争。但是将表及其索引放在不同的表空间时,如果一个表上某索引所在的表空间脱机了,则涉及这张表的 SQL 语句可能由于执行计划仍旧需要使用被脱机的索引而不能成功执行。

其他创建索引语句

 --创建聚集索引CREATE CLUSTER INDEX clu_emp_name ON emp(ename);--创建唯一索引 STORAGE (ON users) 指定表空间,可以不加,默认与表在相同表空间CREATE UNIQUE INDEX dept_unique_index ON dept (dname) STORAGE (ON users);

聚集索引的约束条件:

每张表中只允许有一个聚集索引,如果之前已经指定过 CLUSTER INDEX 或者指定了 CLUSTER PK,则用户新建立 CLUSTER INDEX 时系统会自动删除原先的聚集索引。但如果新建聚集索引时指定的创建方式(列,顺序)和之前的聚集索引一样,则会报错;
指定 CLUSTER INDEX 操作需要重建表上的所有索引,包括 PK 索引;
删除聚集索引时,缺省以 ROWID 排序,自动重建所有索引;
若聚集索引是默认的 ROWID 索引,不允许删除;
聚集索引不能应用到函数索引中;
不能在列存储表上新建/删除聚集索引;
建聚集索引语句不能含有 partition_clause 子句;
在临时表上增删索引会使当前会话上临时 b 树数据丢失;
不支持在含有多媒体类型的表上新建聚集索引。
--创建基于函数的索引
CREATE INDEX idx ON example_tab(column_a + column_b);
SELECT * FROM example_tab WHERE column_a + column_b < 10;

该索引是建立在 column_a + column_b 之上的,所以优化器可以为该查询使用范围扫描。优化器根据该索引计算查询代价,如果代价最少,优化器就会选择该函数索引,column_a + column_b 就不会重复计算
函数索引约束条件:参考文档

表达式不允许为时间间隔类型;表达式中不允许出现半透明加密列;函数索引表达式的长度理论值不能超过 816 个字符(包括生成后的指令和字符串);函数索引不能为 CLUSTER 或 PRIMARY KEY 类型;表达式不支持集函数和不确定函数,不确定函数为每次执行得到的结果不确定,系统中不确定函数包括: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;快速装载不支持含有函数索引的表;若函数索引中要使用用户自定义的函数,则函数必须是指定了 DETERMINISTIC 属性的确定性函数;若函数索引中使用的确定性函数发生了变更或删除,用户需手动重建函数索引;若函数索引中使用的确定性函数内有不确定因素,会导致前后计算结果不同的情况。在查询使用函数索引时,使用数据插入函数索引时的计算结果为 KEY 值;修改时可能会导致在使用函数索引过程中出现根据聚集索引无法在函数索引中找到相应记录的情况,对此进行报错处理;临时表不支持函数索引。

创建位图索引以及创建位图连接索引也可参考上述文档,这里不怎么用到,不再详解。

使用索引

创建测试表

CREATE TABLE T2 (ID int,NAME varchar(20),DEPARTMENT varchar(20),SALARY INT);
CREATE CLUSTER INDEX S21 on T2(ID); //聚集索引
CREATE INDEX S22 on T2(NAME,DEPARTMENT);
CREATE INDEX S23 on T2(NAME);
CREATE INDEX S24 on T2(DEPARTMENT);
CREATE INDEX S25 on T2(SALARY);

使用聚集索引S21查询

EXPLAIN SELECT SALARY FROM T2 WHERE ID=10;

在这里插入图片描述
使用非聚集索引S22查询

EXPLAIN SELECT DEPARTMENT FROM T2 WHERE NAME='Zhang San';

在这里插入图片描述
先使用非聚集索引S23再使用聚集索引

EXPLAIN SELECT * FROM T2 WHERE NAME='Zhang San';

在这里插入图片描述
首先,在 SSEK 中使用 S23 非聚集索引进行扫描定位,得到 NAME;
其次,因为 SELECT * 中查询项太多,需要在 BLKUP2 中通过 S23 回到聚集索引上进行二次查找,得到*中的其它数据。

重建索引

当一个表经过大量的增删改操作后,表的数据在物理文件中可能存在大量碎片,从而影响访问速度。另外,当删除表的大量数据后,若不再对表执行插入操作,索引所处的段可能占用了大量并不使用的簇,从而浪费了存储空间。
可以使用重建索引来对索引的数据进行重组,使数据更加紧凑,并释放不需要的空间,从而提高访问效率和空间效率

--SCHEAM_NAME 为索引所在的模式名,INDEX_ID 为索引 ID
SP_REBUILD_INDEX(SCHEMA_NAME varchar(256), INDEX_ID int);
--  SP_REBUILD_INDEX('SYSDBA', 1547892);

删除索引

删除索引操作

DROP INDEX emp_ename;
--删除不存在的索引会报错。若指定 IF EXISTS 关键字,删除不存在的索引,不会报错
DROP INDEX IF EXISTS emp_ename;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

傅立叶变换与拉普拉斯变换的区别与联系?

傅里叶变换和拉普拉斯变换都是信号处理中的重要工具&#xff0c;它们有以下几个主要区别&#xff1a; 定义域&#xff1a;傅里叶变换是在频率域&#xff08;即虚轴&#xff09;上定义的&#xff0c;而拉普拉斯变换在复平面上的特定区域内定义。 适用范围&#xff1a;傅里叶变换…

在线测径仪的六类测头组合形式!哪种适合你?

在线测径仪&#xff0c;这一现代工业的精密仪器&#xff0c;犹如一位技艺高超的工匠&#xff0c;以其卓越的性能和精准度&#xff0c;为工业生产提供了坚实的保障。它的出现&#xff0c;不仅提高了生产效率&#xff0c;更保证了产品质量&#xff0c;为企业的可持续发展注入了强…

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码]

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种…

SLICEM是如何将查找表配置为分布式RAM/移位寄存器的

1.首先说SliceM和SliceL如何配置为ROM的 一个SLICE包含4个六输入查找表&#xff0c;因此每个查找表就能存储64bit的数据&#xff0c;要实现128bit的ROM&#xff0c;只需要通过两个LUT就可实现&#xff0c;具体如下表: 2.如何配置成为分布式RAM SLICEM中的LUT如下图&#xff…

华为OD机试真题-欢乐的周末-2024年OD统一考试(C卷)

题目描述: 小华和小为是很要好的朋友,他们约定周末一起吃饭。通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达的聚餐地点有多少个? 输入描述: 第一行输入m和n,m代表地图的长度,n代表地图的宽度。 第二行…

Jetpack Compose -> 重组的性能风险和优化

前言 上一章我们讲解了 Jetpack Compose -> mutableStateOf 状态机制的背后秘密 本章我们讲解下重组的性能风险以及怎么优化&#xff1b; 重组的性能风险 前面我们一直在讲重组(ReCompose) 的过程&#xff0c;在使用 mutableStateOf() 以及对于 List 和 Map 在使用 mutatbl…

Excel模板导入、导出工具类

1.引入maven依赖&#xff0c;利用hutool的excel读取 Hutool-poi对excel读取、写入 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency> <depen…

Linux之安装Nginx

目录 传送门前言一、快速安装二、反向代理语法1、基本语法2、location语法1. 基本语法2. 匹配规则3. 修饰符4. 权重5. 嵌套location6. 其他指令7.案例 三、配置反向代理 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff0…

Java 海报-基于Graphics2D 实现个人头像的圆形裁剪

效果&#xff1a; 代码&#xff1a; private static BufferedImage resizeAndClipToCircle(BufferedImage image, int size) {// 缩小图片BufferedImage resizedImage new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);Graphics2D g2d resizedImage.createGraphi…

5.组合与继承

1.面向对象 在C中&#xff0c;面向对象&#xff08;Object-Oriented&#xff09;是一种程序设计范式&#xff0c;它使用“对象”来设计应用程序和软件。面向对象编程&#xff08;OOP&#xff09;的核心概念包括类&#xff08;Class&#xff09;、对象&#xff08;Object&#x…

Vivado综合属性SRL_STYLE怎么用?

“SRL_STYLE”属性是Vivado中用于控制移位寄存器&#xff08;Shift Register Logic, SRL&#xff09;映射方式的关键属性。 本文将详细介绍SRL_STYLE的工作原理、可选值及其在实际设计中的应用代码示例。 一、什么是SRL_STYLE&#xff1f; SRL_STYLE属性用于指导Vivado综合工…

方便快捷!使用Roboflow进行数据增强(附详细操作)

最近使用自定义数据集训练yolov8模型的时候突然发现一件很令人头疼的事情。那就是&#xff0c;数据集中图片太少了。于是想通过数据增强的方法扩大数据集。 通过查阅资料发现&#xff0c;大部分人都是用python中的imgaug库进行图像处理&#xff1b;这种方法最大的不便就是需要转…

【贪心算法】Leetcode 55. 跳跃游戏【中等】

跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&…

RTT设备驱动框架学习(GPIO)

基类对象&#xff0c;定义在rtdef.h中 struct rt_object {char name[RT_NAME_MAX];rt_uint8_t type; //设备类Devicert_uint8_t flag;rt_list_t list; }; //同一类对象挂接在一个链表上设备基类&#xff0c;定义在rtdef.h中&#xff08;属于设备接口层&#xff09; struct rt…

如何通过需求跟踪矩阵加强需求管理?

需求跟踪矩阵是强化需求管理的有效工具&#xff0c;它能直观地展示需求与项目各阶段产出物之间的映射关系&#xff0c;确保每个需求从提出到最终实现都得到严密的跟踪与控制&#xff0c;从而提高需求质量和开发效率&#xff0c;保障项目顺利交付。 如果没有需求跟踪矩阵&#x…

多图详解VSCode搭建Python开发环境

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Elasticsearch】Elasticsearch 从入门到精通(二):基础使用

《Elasticsearch 从入门到精通》共包含以下 2 2 2 篇文章&#xff1a; Elasticsearch 从入门到精通&#xff08;一&#xff09;&#xff1a;基本介绍Elasticsearch 从入门到精通&#xff08;二&#xff09;&#xff1a;基础使用 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的…

用Python将原始边列表转换为邻接矩阵

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在图论和网络分析中&#xff0c;图是一种非常重要的数据结构&#xff0c;它由节点&#xff…

Python 中元组和列表的根本区别是什么?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在 Python 中&#xff0c;元组&#xff08;Tuple&#xff09;和列表&#xff08;List&#xff09;都是用于存储数据序列的数据结构&#xff0c;它们可以存储任何类型的数据&#xff0c;支持通过索引访问…

【AI开发:音频】一、GPT-SoVITS整合工具包的部署问题解决(GPU版)

前言 目前GPT-SoVITS的合成效果比较不错&#xff0c;相比较其他厂商的产品要规整的多。众多厂家中也是国内使用最多的一款了&#xff0c;并且这个整合包里携带了&#xff0c;除背景音、切割、训练、微调、合成、低成本合成等一些列完整的工具&#xff0c;也可以作为API进行使用…