外观
DM 逻辑架构
达梦数据库的逻辑架构采用了分层设计,主要包括以下几个层次:
- 应用层:提供与应用程序的交互接口
- SQL引擎层:处理SQL语句的解析、优化和执行
- 存储引擎层:负责数据的存储和检索
- 事务管理层:确保事务的ACID属性
- 数据字典层:管理数据库对象的元数据
应用层
应用层是达梦数据库与外部应用程序交互的接口层,提供了多种访问方式,包括:
客户端工具
- DM管理工具:图形化管理界面,用于数据库的配置、监控和管理
- DM查询分析器:用于执行SQL语句和查看执行结果
- DM数据迁移工具:用于在不同数据库之间进行数据迁移
- DM性能监控工具:用于监控数据库的性能指标
编程接口
达梦数据库提供了多种编程语言的编程接口,方便应用程序开发:
- ODBC:开放数据库连接,支持多种编程语言
- JDBC:Java数据库连接,用于Java应用程序
- ADO.NET:用于.NET应用程序
- Python DB API:用于Python应用程序
- OCI:兼容Oracle的调用接口,便于从Oracle迁移的应用程序使用
- DPI:达梦专用的编程接口,提供更高的性能和更多的特性
网络通信
应用层通过网络协议与数据库服务器进行通信,支持以下协议:
- TCP/IP:标准的网络通信协议
- SSL/TLS:加密通信协议,确保数据传输安全
SQL引擎层
SQL引擎层是达梦数据库的核心组件之一,负责处理SQL语句的解析、优化和执行。主要包括以下组件:
SQL解析器
SQL解析器负责将用户输入的SQL语句解析为抽象语法树(AST),进行语法检查和语义分析,确保SQL语句的合法性。
查询优化器
查询优化器根据SQL语句和数据库统计信息,生成最优的执行计划。达梦数据库的查询优化器支持以下优化技术:
- 基于代价的优化:根据各种操作的代价估算,选择代价最低的执行计划
- 基于规则的优化:根据预定义的优化规则,对SQL语句进行重写和优化
- 统计信息收集:收集表、索引等对象的统计信息,为优化器提供决策依据
- 查询计划缓存:缓存生成的执行计划,避免重复优化,提高查询效率
执行器
执行器负责按照优化器生成的执行计划执行SQL语句,包括:
- 操作符执行:执行各种查询操作符,如扫描、连接、排序、聚合等
- 数据访问:与存储引擎层交互,获取和修改数据
- 结果集处理:处理查询结果,返回给客户端
存储引擎层
存储引擎层负责数据的物理存储和检索,是达梦数据库的核心组件之一。达梦数据库支持多种存储引擎,包括:
行存储引擎
行存储引擎以行为单位存储数据,适合OLTP(在线事务处理)应用,具有以下特点:
- 适合频繁的插入、更新和删除操作
- 适合查询整行数据的场景
- 支持事务的ACID属性
列存储引擎
列存储引擎以列为单位存储数据,适合OLAP(在线分析处理)应用,具有以下特点:
- 适合大数据量的查询和分析
- 适合只查询部分列的场景
- 具有较高的压缩率,节省存储空间
行列融合存储引擎
行列融合存储引擎结合了行存储和列存储的优点,适合HTAP(混合事务/分析处理)应用,具有以下特点:
- 同时支持OLTP和OLAP应用
- 根据不同的查询类型自动选择合适的存储方式
- 提供了良好的性能平衡
事务管理层
事务管理层负责确保事务的ACID(原子性、一致性、隔离性、持久性)属性,主要包括以下组件:
事务管理器
事务管理器负责事务的开始、提交和回滚,维护事务的状态信息。
并发控制
并发控制机制用于处理多个事务同时访问数据时的冲突,确保事务的隔离性。达梦数据库支持以下并发控制技术:
- 锁机制:包括共享锁、排他锁、意向锁等,用于控制数据的访问权限
- 多版本并发控制(MVCC):通过维护数据的多个版本,允许读事务和写事务并发执行,提高并发性能
- 死锁检测和处理:自动检测死锁,并通过回滚其中一个事务来解决死锁
日志管理
日志管理负责记录数据库的所有修改操作,确保事务的持久性和可恢复性。达梦数据库的日志包括:
- 重做日志(Redo Log):记录数据的修改操作,用于崩溃恢复
- 回滚日志(Undo Log):记录数据的旧值,用于事务回滚和MVCC
数据字典层
数据字典层管理数据库对象的元数据,包括表、索引、视图、存储过程等对象的定义和属性。数据字典存储在系统表中,用户可以通过查询系统表来获取数据库对象的元数据信息。
系统表
达梦数据库的系统表包括:
- 基础系统表:存储数据库的基本信息,如数据库版本、字符集等
- 对象定义表:存储表、索引、视图等对象的定义
- 权限管理表:存储用户、角色和权限信息
- 性能统计表:存储数据库的性能统计信息
数据字典缓存
为了提高数据字典的访问效率,达梦数据库将常用的数据字典信息缓存在内存中,称为数据字典缓存。当需要访问数据字典时,首先检查缓存,如果缓存中存在则直接使用,否则从磁盘读取并缓存。
数据库对象模型
达梦数据库支持多种数据库对象,包括:
表
表是存储数据的基本单位,由行和列组成。达梦数据库支持以下表类型:
- 普通表:最基本的表类型
- 分区表:将表数据按照一定规则分布到多个分区中,提高查询和维护效率
- 临时表:用于存储临时数据,会话结束后自动删除
- 外部表:指向外部数据源的表,不存储实际数据
索引
索引用于提高数据查询的效率,达梦数据库支持以下索引类型:
- B树索引:最常用的索引类型,适合范围查询和等值查询
- 哈希索引:适合等值查询,不支持范围查询
- 位图索引:适合低基数列的查询
- 全文索引:用于文本内容的全文检索
- 空间索引:用于空间数据的查询
视图
视图是从一个或多个表中导出的虚拟表,不存储实际数据,只存储查询定义。达梦数据库支持以下视图类型:
- 普通视图:基于SELECT语句的视图
- 物化视图:将查询结果存储在磁盘上的视图,提高查询效率
存储过程和函数
存储过程和函数是预编译的SQL语句集合,存储在数据库中,可被多次调用。达梦数据库支持PL/SQL语法,与Oracle兼容。
触发器
触发器是与表关联的特殊存储过程,当表发生插入、更新或删除操作时自动执行。达梦数据库支持以下触发器类型:
- 行级触发器:对每一行数据的修改都触发一次
- 语句级触发器:对整个SQL语句触发一次
- BEFORE触发器:在事件发生前执行
- AFTER触发器:在事件发生后执行
序列
序列用于生成唯一的数字序列,常用于主键生成。
同义词
同义词是数据库对象的别名,用于简化对象访问和提供安全性。
数据组织方式
表空间
表空间是达梦数据库中数据存储的逻辑单位,每个表空间由一个或多个数据文件组成。表空间的主要作用包括:
- 管理数据的存储位置
- 控制数据的磁盘分配
- 实现数据的备份和恢复
- 提供数据的隔离性
达梦数据库包括以下系统表空间:
- SYSTEM表空间:存储系统字典信息
- ROLL表空间:存储回滚段信息
- TEMP表空间:存储临时数据
- MAIN表空间:默认的用户表空间
段、区、页
达梦数据库的数据存储采用了段、区、页的层次结构:
- 页(Page):最小的存储单位,默认大小为8KB
- 区(Extent):由连续的页组成,是分配存储空间的基本单位
- 段(Segment):由多个区组成,是表、索引等对象的存储单位
版本差异
DM7 逻辑架构
DM7的逻辑架构相对简单,主要包括:
- 应用层
- SQL引擎层
- 存储引擎层(主要是行存储引擎)
- 事务管理层
- 数据字典层
DM8 逻辑架构
DM8在DM7的基础上进行了扩展和优化,主要改进包括:
- 增加了列存储引擎和行列融合存储引擎,支持HTAP应用
- 增强了查询优化器,支持更多的优化技术
- 改进了并发控制机制,提高了并发性能
- 增加了MPP分布式架构支持
- 增强了安全性特性
最佳实践
逻辑架构设计建议
- 根据业务类型选择合适的存储引擎:OLTP应用选择行存储引擎,OLAP应用选择列存储引擎,混合应用选择行列融合存储引擎
- 合理设计表空间:将不同类型的数据存储在不同的表空间中,便于管理和维护
- 优化索引设计:根据查询模式设计合适的索引,避免过多或不合理的索引
- 合理使用分区表:对于大数据量的表,使用分区表可以提高查询和维护效率
- 优化SQL语句:编写高效的SQL语句,避免复杂的嵌套查询和全表扫描
性能优化建议
- 收集统计信息:定期收集表和索引的统计信息,确保优化器生成准确的执行计划
- 使用绑定变量:对于频繁执行的SQL语句,使用绑定变量可以提高查询计划缓存的命中率
- 调整内存参数:根据系统配置和业务需求,调整数据库的内存参数,如缓冲区大小、共享池大小等
- 监控和分析性能:定期监控数据库性能,分析性能瓶颈,及时进行优化
常见问题(FAQ)
Q1: 达梦数据库支持哪些存储引擎?
A1: 达梦数据库支持以下存储引擎:
- 行存储引擎:适合OLTP应用
- 列存储引擎:适合OLAP应用
- 行列融合存储引擎:适合HTAP应用
Q2: 达梦数据库的SQL引擎与Oracle兼容吗?
A2: 达梦数据库的SQL引擎兼容Oracle的PL/SQL语法,支持存储过程、触发器、函数等Oracle特性,便于从Oracle迁移的应用程序使用。
Q3: 如何查看达梦数据库的执行计划?
A3: 可以通过以下方式查看达梦数据库的执行计划:
- 使用DM查询分析器,在执行SQL语句前勾选"显示执行计划"
- 使用SQL语句:
EXPLAIN SELECT * FROM table_name; - 使用性能监控工具查看实时执行计划
Q4: 达梦数据库的表空间与Oracle的表空间有什么区别?
A4: 达梦数据库的表空间概念与Oracle类似,但有一些区别:
- 达梦数据库的默认页大小为8KB,Oracle的默认块大小为8KB
- 达梦数据库的表空间由数据文件组成,Oracle的表空间由数据文件和临时文件组成
- 达梦数据库的系统表空间包括SYSTEM、ROLL、TEMP和MAIN,Oracle的系统表空间包括SYSTEM、SYSAUX、UNDOTBS1、TEMP等
Q5: 如何优化达梦数据库的查询性能?
A5: 优化达梦数据库查询性能的方法包括:
- 设计合适的索引
- 编写高效的SQL语句
- 收集统计信息
- 使用绑定变量
- 调整内存参数
- 优化表结构设计
Q6: 达梦数据库支持分区表吗?
A6: 是的,达梦数据库支持分区表,可以按照范围、列表、哈希等方式进行分区。分区表可以提高大数据量表的查询和维护效率。
