首页 > 数据库 >达梦数据库系列—6.索引管理

达梦数据库系列—6.索引管理

时间:2024-06-23 19:29:01浏览次数:27  
标签:INDEX NAME 毫秒 数据库 T2 索引 SQL 达梦

目录

1、管理索引的准则

1.1索引正确的表和列

1.2合适的组合索引

1.3限制每个表的索引的数量

1.4为每个索引指定表空间

2、创建索引

2.1创建聚集索引

2.2创建唯一索引

2.3创建函数索引

2.4创建位图索引

3、SQL 语句中使用索引

4、重建索引

5、删除索引

6、查看索引信息


1、管理索引的准则

1.1索引正确的表和列

1.如果需要经常地检索大表中的少量的行,就为查询键创建索引;

2.为了改善多个表的连接的性能,可为连接列创建索引;

3.主键和唯一键自动具有索引;

4.小表不需要索引。

1.2合适的组合索引

如果查询中有多个字段组合定位,则不应为每个字段单独创建索引,而应该创建一个组合索引。

当两个或多个字段都是等值查询时,组合索引中各个列的前后关系是无关紧要的。但是如果是非等值查询时,要想有效利用组合索引,则应该按等值字段在前,非等值字段在后的原则创建组合索引。

1.3限制每个表的索引的数量

如果一个表主要仅用于读,则索引多就有好处;如果一个表经常被更新,则索引不宜多建。索引越多,修改表数据的开销就越大。

1.4为每个索引指定表空间

将表及其索引放在不同的表空间(在不同磁盘上)产生的性能比放在相同的表空间更好,因为这样做减少了磁盘竞争。

2、创建索引

2.1创建聚集索引

DM8 中表(列存储表和堆表除外)都是使用 B 树索引结构管理的,每一个普通表都有且仅有一个聚集索引,当建表语句未指定聚集索引键时,DM8 的默认聚集索引键是 ROWID。若指定索引键,表中数据都会根据指定索引键排序。

建表后,DM8 也可以用创建新聚集索引的方式来重建表数据,并按新的聚集索引排序。

CREATE CLUSTER INDEX clu_emp_name ON emp(ename);

新建聚集索引会重建这个表以及其所有索引,包括二级索引、函数索引,是一个代价非常大的操作。因此,最好在建表时就确定聚集索引键。

2.2创建唯一索引

唯一索引可以保证表上不会有两行数据在键列上具有相同的值。

CREATE UNIQUE INDEX dept_unique_index ON dept (dname) STORAGE (ON users);

2.3创建函数索引

基于对表中列进行计算后的结果创建索引。如果没有函数索引,那么任何在列上执行了函数的查询都不能使用这个列的索引。

1.函数索引创建时要和使用时保持一致

2.不建议使用自定义函数

3.表达式不支持集函数和不确定函数,不确定函数为每次执行得到的结果不确定,系统中不确定函数包括: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;

举例说明:

SQL> create table test.t1 as select * from "DMHR"."EMPLOYEE";

操作已执行

已用时间: 20.757(毫秒). 执行号:901.

SQL> EXPLAIN select * from test.t1 where to_char(HIRE_DATE,'yyyy-mm-dd') ='2012-03-27';


1   #NSET2: [1, 21, 285]

2     #PRJT2: [1, 21, 285]; exp_num(12), is_atom(FALSE)

3       #SLCT2: [1, 21, 285]; exp11 = '2012-03-27'

4         #CSCN2: [1, 856, 285]; INDEX33555625(T1); btr_scan(1)


已用时间: 1.687(毫秒). 执行号:0.

SQL> create index idx_func_t1 on TEST.T1(to_char(HIRE_DATE,'yyyy-mm-dd'));

操作已执行

已用时间: 17.666(毫秒). 执行号:901.

SQL> EXPLAIN select * from test.t1 where to_char(HIRE_DATE,'yyyy-mm-dd') ='2012-03-27';


1   #NSET2: [1, 21, 285]

2     #PRJT2: [1, 21, 285]; exp_num(12), is_atom(FALSE)

3       #BLKUP2: [1, 21, 285]; IDX_FUNC_T1(T1)

4         #SSEK2: [1, 21, 285]; scan_type(ASC), IDX_FUNC_T1(T1), scan_range['2012-03-27','2012-03-27']


已用时间: 1.605(毫秒). 执行号:0.

SQL> 

以上可见,建了函数索引idx_func_t1为to_char(HIRE_DATE,'yyyy-mm-dd')后,再次查询,执行计划走索引idx_func_t1,查询效率有提升。

2.4创建位图索引

位图索引主要针对含有大量相同值的列而创建。

CREATE BITMAP INDEX S1 ON PURCHASING.VENDOR (VENDORID);

1.不支持对大字段创建位图索引;

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

3.MPP 环境下不支持位图索引的创建;

4.不支持全局位图索引;

3、SQL 语句中使用索引

如果 SQL 语句想使用某一个索引,则SQL 语句的查询项和 WHERE 子句的过滤项中必须包含该索引的全部索引键。

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);

例 1 使用聚集索引 S21

EXPLAIN SELECT SALARY FROM T2 WHERE ID=10;

例 2 使用非聚集索引 S22

EXPLAIN SELECT DEPARTMENT FROM T2 WHERE NAME LIKE'%Zhang' AND DEPARTMENT='A部门';

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

举例说明:

SQL> CREATE TABLE test.T2 (ID int,NAME varchar(20),DEPARTMENT varchar(20),SALARY INT);

操作已执行

已用时间: 7.072(毫秒). 执行号:902.

SQL> insert into test.t2 select employee_id,employee_name,identity_card,salary from test.t1;

影响行数 856


已用时间: 2.495(毫秒). 执行号:903.

SQL> commit;

操作已执行

已用时间: 1.654(毫秒). 执行号:904.

SQL> set schema test;

操作已执行

已用时间: 0.302(毫秒). 执行号:0.

SQL> CREATE CLUSTER INDEX S21 on T2(ID);

操作已执行

已用时间: 62.835(毫秒). 执行号:906.

SQL> CREATE INDEX S22 on T2(NAME,DEPARTMENT);

操作已执行

已用时间: 12.905(毫秒). 执行号:907

SQL> CREATE INDEX S23 on T2(NAME);

操作已执行

已用时间: 12.786(毫秒). 执行号:908.

SQL> CREATE INDEX S24 on T2(DEPARTMENT);

操作已执行

已用时间: 13.661(毫秒). 执行号:909.

SQL> EXPLAIN SELECT SALARY FROM T2 WHERE ID=1001;


1   #NSET2: [1, 21, 8]

2     #PRJT2: [1, 21, 8]; exp_num(1), is_atom(FALSE)

3       #CSEK2: [1, 21, 8]; scan_type(ASC), S21(T2), scan_range[1001,1001]


已用时间: 1.061(毫秒). 执行号:0.

SQL> EXPLAIN SELECT DEPARTMENT FROM T2 WHERE NAME LIKE'马%' AND DEPARTMENT='340102196202303000';


1   #NSET2: [1, 1, 96]

2     #PRJT2: [1, 1, 96]; exp_num(1), is_atom(FALSE)

3       #SLCT2: [1, 1, 96]; T2.DEPARTMENT = '340102196202303000'

4         #SSEK2: [1, 1, 96]; scan_type(ASC), S22(T2), scan_range[('马',min),('驭',min))


已用时间: 0.697(毫秒). 执行号:0.

SQL> EXPLAIN SELECT DEPARTMENT FROM T2 WHERE NAME LIKE'马%' ;


1   #NSET2: [1, 32, 96]

2     #PRJT2: [1, 32, 96]; exp_num(1), is_atom(FALSE)

3       #SSEK2: [1, 32, 96]; scan_type(ASC), S22(T2), scan_range[('马',min),('驭',min))


已用时间: 0.736(毫秒). 执行号:0.

SQL> EXPLAIN SELECT * FROM T2 WHERE NAME LIKE '马%';


1   #NSET2: [1, 32, 116]

2     #PRJT2: [1, 32, 116]; exp_num(5), is_atom(FALSE)

3       #BLKUP2: [1, 32, 116]; S23(T2)

4         #SSEK2: [1, 32, 116]; scan_type(ASC), S23(T2), scan_range['马','驭')


已用时间: 0.621(毫秒). 执行号:0.

4、重建索引

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

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

生产环境建议使用 online 方式重建,不影响表的 DML 操作:

alter index HRTEST.IX_EMP01_EMPLOYEENAME rebuild ONLINE;

5、删除索引

DROP INDEX IF EXISTS emp_ename;

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

ALTER TABLE emp DROP CONSTRAINT pk_emp_name;

6、查看索引信息

查看索引的定义  

SELECT INDEXDEF(INDEX_ID int, PREFLAG int);

INDEX_ID 为索引 ID,PREFLAG 表示返回信息中是否增加模式名前缀,0或1。

SQL> SELECT INDEXDEF(33555645, 1);


行号     INDEXDEF(33555645,1)                                                                                  

---------- ------------------------------------------------------------------------------------------------------

1          CREATE OR REPLACE CLUSTER  INDEX "TEST"."S21" ON "TEST"."T2"("ID" ASC) STORAGE(ON "TBS", CLUSTERBTR) ;


已用时间: 1.777(毫秒). 执行号:913.

数据字典:

select * from dba_indexes t where t.OWNER ='HRTEST';

select * from dba_ind_columns t where t.index_OWNER ='HRTEST';

--索引的有效性和可见性(只有有效且可见的索引,执行计划才会选择走该索引)

select t.INDEX_NAME, t.INDEX_TYPE, t.TABLE_NAME, t.TABLE_OWNER, t.status,

t.VISIBILITY from user_indexes t; 

标签:INDEX,NAME,毫秒,数据库,T2,索引,SQL,达梦
From: https://blog.csdn.net/md54333/article/details/139904735

相关文章

  • [MYSQL] 数据库基础
    1.什么是数据库从数据库的名字可以看出,它是用来操作(增删查改....)数据的,事实上也的确如此,通过数据库,我们可以更方便.更高效的来操作.管理数据以文件形式存储数据的缺点文件的安全问题文件不利于数据的查询和删除文件不利于存储海量数据操作文件并不方便为了解决上述......
  • mysql索引
    2024.6.231.简单地说是const是直接按主键或唯一键读取,eq_ref用于联表查询的情况,按联表的主键或唯一键联合查询。const该表最多有一个匹配行,在查询开始时读取。由于只有一行,因此该行中列的值可以被优化器的其余部分视为常量。const表非常快,因为它们只读一次。const用于将......
  • 用ChatGPT革新SEO:搜索引擎优化的AI驱动策略
    用ChatGPT革新SEO:搜索引擎优化的AI驱动策略引言搜索引擎优化(SEO)是数字营销中不可或缺的一部分,它影响着网站在搜索引擎结果页(SERP)上的表现。随着人工智能(AI)技术的兴起,ChatGPT等AI工具为SEO带来了新的机遇。本文将深入探讨如何利用ChatGPT辅助SEO,提供一系列创新策略和实践指......
  • 数据库系统概论(超详解!!!) 第十四节 数据库并发控制机制
    多用户数据库系统:允许多个用户同时使用的数据库系统例:飞机定票数据库系统银行数据库系统特点:在同一时刻并发运行的事务数可达数百上千个多事务执行方式:(1)事务串行执行每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。不能充分利用系统资源,发挥数据库......
  • 喜报!极限科技新获得一项国家发明专利授权:“搜索数据库的正排索引处理方法、装置、介质
    近日,极限数据(北京)科技有限公司(简称:极限科技)新获得一项国家发明专利授权,专利名为“搜索数据库的正排索引处理方法、装置、介质和设备”,专利号:ZL202410479400.9,授权日为2024年6月21日,标志着极限科技在数据库搜索技术领域的自主创新能力再次得到国家级认可。创新技术,提升......
  • 服务器阵列数据库修复
    故障描述HP存储,存储空间由8块450GBSAS的硬盘组成,其中7块硬盘组成一个RAID5的阵列,剩余1块做成热备盘使用。RAID5阵列中出现2块硬盘损坏,而此时只有一块热备盘成功激活,因此导致RAID5阵列瘫痪,上层LUN无法正常使用。raid数据恢复故障分析没有检测到磁盘有物理故障与坏道,可能由于......
  • mysql数据库知识点总结
    MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem:关系数据库管理系统)应用软件之一。mysql一、数据库的好处1、可以持久化数据到本地2、结构化查询二、数据库的常见概念★1、DB:数据库,存储数据的......
  • 【机器学习】在【R语言】中的应用:结合【PostgreSQL数据库】的【金融行业信用评分模型
    目录1.数据库和数据集的选择1.准备工作2.PostgreSQL安装与配置3.R和RStudio安装与配置2.数据导入和预处理1.连接数据库并导入数据1.连接数据库2.数据检查和清洗1.数据标准化2.拆分训练集和测试集3.特征工程1.生成新特征2.特征选择4.模型训练和评估1.逻辑回归2.......
  • aspera下载nr数据库
     ascp-QT-i~/.aspera/connect/etc/[email protected]:/blast/db/nr.00.tar.gz./ 002ascp-QT-i~/.aspera/connect/etc/[email protected]:/genome......
  • MySOL数据库基础
    一、数据库简介1.数据库的特点存储大量信息,方便检索和访问。保持数据的完整性,一致性,降低数据冗余。应用共享和安全。2.数据库的基本概念数据:描述事物的符号记录,包括数字,文字,图形,图像,声音,档案记录。以“记录”的形式按照统一格式进行存储。表:不同记录组织在一起,形成数据库......