注册
达梦数据库认证专家知识整理
专栏/培训园地/ 文章详情 /

达梦数据库认证专家知识整理

企鹅TZ 2024/09/27 633 0 0
摘要

索引管理

统计信息

对象统计信息描述数据是如何在数据库中存储的,统计信息是优化器(CBO)的代价计算的依据,可以帮助优化器较精确地估算成本,对执行计划的选择起着至关重要的作用。达梦中的优化器都是基于代价的优化器

达梦数据的统计信息分三种类型:表统计信息、列统计信息、索引统计信息。

统计信息生成过程分以下三个步骤:

确定采样的数据:根据数据对象,确定需要分析哪些数据。

表:计算表的行数、所占的页数目、平均记录长度

列:统计列数据的分布情况

索引:统计索引列的数据分布情况

确定采样率

根据数据对象的大小,通过内部算法,确定数据的采样率。采样率与数据量成反比。

生成直方图

有两种类型的直方图:频率直方图和等高直方图。根据算法分析表的数据分布特征, 确定直方图的类型。频率直方图的每个桶(保存统计信息的对象)的高度不同,等高直方图每个桶的高度相同。例如,对列生成统计信息,当列值分布比较均匀时,会采用等高直方图,否则,采用频率直方图

在执行查询时,如果数据对象存在统计信息,代价算法可以根据统计信息中的数据,比较精确地计算出操作所需花费的成本,以此来确定连接方式、对象访问路径、连接顺序,选择最优的执行计划。

--查询JEECG模式下ACT_HI_ACTINST表的id_字段的统计信息
DBMS_STATS.COLUMN_STATS_SHOW('JEECG','ACT_HI_ACTINST','PROC_DEF_ID_')
--更新已有统计信息
DBMS_STATS.UPDATE_ALL_STATS
--查询jeecg用户的统计信息
DBMS_STATS.GATHER_SCHEMA_STATS('JEECG')
索引
索引是与表相关的可选的结构(聚簇索引除外),它能使对应于表的 SQL 语句执行得更快,因为有索引比没有索引能更快地定位信息。DM8 索引能提供访问表的数据的更快路径,可以不用重写任何查询而使用索引,其结果与不使用索引是一样的,但速度更快。

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

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

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

具有 CREATE ANY INDEX 数据库权限。

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

聚簇索引(一级索引)和二级索引的区别

  1. 一级索引存储的是数据本身,不需要回表,效率快
  2. 二级索引存储的是主键的值,需要回表,效率慢

聚簇索引

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

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

新建聚集索引会重建这个表以及其所有索引,包括二级索引、函数索引,是一个代价非常大的操作

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

若聚集索引是默认的 ROWID 索引,不允许删除;

CREATE CLUSTER INDEX clu_emp_name ON emp(ename);

唯一索引

索引可以是唯一的或非唯一的。唯一索引可以保证表上不会有两行数据在键列上具有相同的值,非唯一索引不会在键列上施加这个限制。

用户可以在希望的列上定义 UNIQUE 完整性约束,DM8 通过自动地在唯一键上定义一个

唯一索引来保证 UNIQUE 完整性约束。

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

函数索引

基于函数的索引促进了限定函数或表达式的返回值的查询,该函数或表达式的值被预先计算出来并存储在索引中。

CREATE INDEX IDX ON EXAMPLE_TAB(COLUMN_A + COLUMN_B);

复合索引

索引由表中的多列构成,注意先后顺序

在复合索引中,单独使用前导列(第一列)优化器会走二级索引,单独使用非前导列,优化器不会走二级索引,会走全表扫,如果同时使用复合索引字段,优化器会走二级索引。

索引在查询语句里面是否会用到和 sql 编写相关。包括索引的扫描方 式,都会根据表中的列值分布,统计信息,过滤字段的不同而不同

create index test.emp_ind2 on test.emp(employee_id,employee_name) tablespace IND;

位图索引

对低基数的列创建位图索引,列上的值的类型少的情况下使用位图索引

全文索引

全文检索技术是智能信息管理的关键技术之一,其主要目的就是实现对大容量的非结构化数据的快速查找,DM 实现了全文检索功能,并将其作为 DM 服务器的一个较独立的组件,提供更加准确的全文检 索功能,较好地解决了模糊查询方式带来的问题。

DM 中,全文索引必须在基表定义,而不能在系统表,视图,临时表,列存表,外部表上定义,同一个只能创建一个全文索引,在创建全文索引的时候,用户可以为分词器定义分词参数,即控制分词器的数量。

全文检索的中文分词依赖系统词库,该词库是只读的,不允许修改。

CHINESE_LEXER --中文最少分词

CHINESE_VGRAM_LEXER --机械双字分词

CHINESE_FP_LEXER 中文最多分词

ENGLISH_LEXER --英文分词


-- 使用全局索引
select * from "JEECG"."YB_TEST_WORD" where contains(word_test,'索引' and '单独' or '在')

--全文索引更新
ALTER CONTEXT index cti_address on person.address rebuild;
--查看全文索引
Select * from ctisys.syscontextindexes;
--创建全文索引
CREATE CONTEXT INDEX "yangbo_test" ON "JEECG"."YB_TEST_WORD"(word_test)
TABLESPACE "JEECG"
LEXER CHINESE_LEXER SYNC;
索引相关字典
select * from dba_indexes
索引注意事项
索引使用准则

使用下面的准则来决定何时创建索引:

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

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

主键和唯一键自动具有索引,在外键上很多情况下也创建索引;

小表不需要索引。

选取表中的索引列时可以考虑以下几点:

列中的值相对比较唯一 ;

取值范围大,适合建立索引;

CLOB 和 TEXT 只能建立全文索引、BLOB 不能建立任何索引。

限制表中索引数量

一个表可以有任意数量的索引。但是,索引越多,修改表数据的开销就越大。当插入或删除行时,表上的所有索引也要被更改;更改一个列时,包含该列的所有索引也要被更改。因此,在从表中检索数据的速度和更新表的速度之间有一个折衷。例如,如果一个表主要仅用于读,则索引多就有好处;如果一个表经常被更新,则索引不宜多建。

预估索引大小和设置存储参数

创建索引之前先估计索引的大小能更好地促进规划和管理磁盘空间。可以用索引以及回滚段、重做日志文件的组合估计的大小来决定支持所期望的数据库所需的磁盘空间的大小。通过这些估计,就可以购买合适的硬件和做出其他正确的决定。

用单个索引估计的大小能更好地管理索引使用的磁盘空间。创建索引时,可以设置适当 的存储参数,并改善使用该索引的应用的 I/O 性能。例如,假设在创建索引之前估计索引的最大大小,之后就可以在创建该索引时设置适当的存储参数,就能很少为表的数据段分配簇。并且,所有的该索引的数据都被保存在相对连续的磁盘空间扇区中,这就减少了使用该索引的磁盘 I/O 操作所需的时间。

为索引指定表空间

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

执行计划
执行计划是 SQL 语句的执行方式,由查询优化器为语句设计的执行方式,交给执行器去执行。在 SQL 命令行使用 EXPLAIN 可以打印出语句的执行计划。

一个执行计划由若干计划节点组成: 每一个计划节点包含操作符(cscn2, slct2..)和他的代价([1,856,280])等信息,代价由一个三元组组成[代价,记录行数,每行的字节数]

执行过程为:控制流从上向下传递,数据流从下向上传递。

--查找执计划节点操作符的字典
select * from v$sql_node_name

安全管理

审计分析
审计员:SYSAUDITOR

系统审计

系统的启动与关闭,此级别的审计记录在任何情况下都会强制产生,无法也无需由用户进行设置。

语句审计

导致影响特定类型数据库对象的特殊 SQL 或语句组的审计。如 AUDIT TABLE 将审计 CREATE TABLE、ALTER TABLE 和 DROP TABLE 等语句。

对象审计

审计作用在特殊对象上的语句。如 PERSON 表上的 INSERT, delete,update 语句。

审计开启

在 DM 系统中,启用审计功能需要两步

打开审计开关(默认审计开关是关闭),并重启数据库服务。

对审计对象设置审计条件,否则不记录审计

审计开关

--0 :关闭审计 1:打开普通审计 2:打开普通审计和实时审计,缺省值为 0
SP_SET_ENABLE_AUDIT(PARAM INT)
语句审计

--TYPE:审计对象(表,视图,存储过程)
--Username:用户,null 表示不限制
--Whenever:审计时机 ALL: 不管成功或是失败都审计;SUCCESSFUL:操作成功的时候审计;FAIL:操作失败的时候审计

SP_audit_stmt(type,username,whenever)
--例如:
SP_audit_stmt('TABLE','JEECG','ALL')
--查看审计
select * from v$auditrecords;
关闭语句级审计

Sp_noaudit_stmt(type,username,whenever)

Sp_noaudit_stmt(‘TABLE’,’TEST’,’ALL’);

对象审计

--TYPE:审计对象(表,视图,存储过程)
--Username:用户,null 表示不限制
--schema_name:模式名
--object_name: 对象名
--column_name: 列名
--whenever :审计时机 ALL: 不管成功或是失败都审计;SUCCESSFUL:操作成功的时候审计;FAIL:操作失败的时候审计

Sp_audit_object(type, username, schema_name, object_name, column_name, whenever)

例如:sp_audit_object('UPDATE','TEST','TEST','EMP','SALARY','ALL');
关闭对象级审计

Sp_noaudit_object(‘INSERT’,’TEST’,’TEST’,’EMP’,’SALARY’,’ALL);

关于审计设置的说明

只要审计功能被启用,系统级的审计记录就会产生。

在进行数据库审计的时候,审计员之间没有区别,可以审计所有数据库对象,也可以取消其他审计员的审计设置

语句级审计不针对特定的对象,只针对用户

对象级审计针对指定的用户与指定的对象进行审计。

在设置审计时,审计选项不区分包含关系,审计时机不区分包含关系,都可以设置

如果用户执行的一条语句与设置的若干审计项都匹配,只会在审计文件中生成一条审计记录。

数据库安全基线
账号和密码安全

select * from dba_users
DBA:具有几乎所有权限(除审计和强制访问控制之外),默认赋给 SYSDBA 用户。

PUBLIC:具有对当前模式下对象的 DML 数据操作权限。

RESOURCE:具有在当前模式下数据定义权限(创建表、索引、视图等),

SOI:具有查询 sys 开头系统表的权限

VTI:具有查询 v$开头的动态视图权限

数据库版本升级

select id_code;
select * from v$instance;
select * from v$license;
select * from v$version

数据库监控

使用 DEM 来监控

使用./monitor 监控管理工具来监控

会话监控

select count(*) from v$sessions where state='ACTIVE';

select * from v$sessions where state='ACTIVE'
死锁监控

锁分为TID锁,对象锁,

共享锁 S,排他锁 X,意向锁 IX IS

select b.object_name,c.sess_id,a.* from v$lock a ,dba_objects b, v$sessions c
where a.table_id=b.object_id
and ltype='OBJECT'
and a.trx_id=c.trx_id
sql语句监控

select *from v$sql_history
表空间监控

select * from v$DATAFILE

select * from dba_data_files
资源监控

达梦数据加载

dmfld(DM Fast Loader)是 DM 提供的快速数据装载命令行工具。用户通过使用 dmfldr 工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到 DM 数据库中,或把 DM 数据库中的数据按照一定格式写入文本文件。

数据文件

1,aaaaa,2022-04-21
2,bbbbb,
3,cccc,2021-11-11

控制文件

LOAD DATA
INFILE '/dm8/fldr/fldrtest.txt'
INTO TABLE TEST.FLDRTEST
FIELDS ','

创建表

create table jeecg.yangbo_fast(id int, name varchar(20), bir date);

批量加载

./dmfldr sysdba/dameng123 control='/dm8/fldr/fldrtest.ctl'
大字段导入导出

create table test.dtoutput(c1 int, c2 blob, c3 clob);

insert into test.dtoutput values(1,0XAB1211032DE,'THIS IS A dmfldr test');

[dmdba@localhost fldr]$ cat dtfldr.ctl
LOAD DATA
INFILE '/dm8/fldr/dtfldr.txt'
INTO TABLE TEST.DTOUTPUT
FIELDS '|'

导出

[dmdba@localhost bin]$ ./dmfldr sysdba/dameng123 control='/dm8/fldr/dtfldr.ctl' lob_directory='/dm8/fldr' mode='out'

导出后,导入

[dmdba@localhost fldr]$ cat dtfldr.ctl LOAD DATA INFILE '/dm8/fldr/dtfldr.txt' INTO TABLE TEST.DTINPUT FIELDS '|' (C1, C2, C3)

案例三

1、创建数据文件
[dmdba@localhost fldr]$ cat test2.txt ID,NAME 1,AAAA 2,BBBB 34,dddddd
2、创建表
create table test.t50(id int, name varchar(20));
3、创建控制文件
[dmdba@localhost fldr]$ cat test2.ctl
options( skip=1 )
LOAD DATAINFILE '/dm8/fldr/test2.txt'
INTO TABLE TEST.T50
FIELDS ','
4、加载数据
[dmdba@localhost bin]$ ./dmfldr sysdba/dameng123 control='/dm8/fldr/test2.ctl' badfile='/dm8/fldr/test2.bad
性能优化
内存管理
共享内存池

select * from v$dm_ini where para_name like '%MEMORY%'
Memory_target:指定单个共享内存池的目标大小

Memory_pool: 指定单个共享内存池的初始大小

Memory_extent_size:提定单个共享内存池的增量大小

Memory_N_pool:指定多个共享内存池

缓冲区

数据缓冲区

normal(buffer)

keep

fast

recycle

日志缓冲区

主要存储redo日志

RLOG_BUF_SIZE

字典缓冲区

DICT_BUF_SIZE

sql缓冲区

select * from v$dm_ini where para_name like '%cache_pool_size%'
运行时内存池

会话内存池

虚拟机内存池

排序区和哈希区

后台的进程和线程
达梦是单进程多线程的,每一个实例只有一个进程

v$process 进程字典

v$threads 线程字典

sql执行的过程
语法分析(字典缓冲区)

语义分析(字典缓冲区)

权限判断(字典缓冲区)

是否存在执行计划( sql缓冲区,buffer)

执行sql,结果缓冲到sql缓冲区,(sql缓冲区,排序区,哈希区,buffer)

sql优化

--等于1时,et可以使用
select * from v$dm_ini where para_name = 'enable_monitor'

select * from v$dm_ini where para_name = 'monitor_sql_exec'

call et(执行号)
awr报告
SYS.WRM$_WR_CONTROL 记录快照的相关控制信息。

Sys.wrm$_snapshot 记录快照的相关信息
初始化awr快照包

--查看awr是否创建
select sf_check_awr_sys;
--初始化awr包
sp_init_awr_sys(1);

--创建快照包的间隔时间(分钟)
call dbms_workload_repository.awr_set_interval(10);

--手动生成快照
call dbms_workload_repository.create_snapshot();

--查询快照
select * from sys.wrm$_snapshot;

--生成awr报告
call sys.awr_report_html(1,4,'/dm8','awr1.html');

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服