DM数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了下述划分,并采用了不同的管理模式。
(1) 内存池
(2) 缓冲区
(3) 排序区
排序区提供数据排序所需要的内存空间。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
(4) 哈希区
哈希区提供哈希连接所需要的内存空间。本质上是个虚拟缓冲区。系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。
如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。
SQL – 词法语法分析 – 语义分析 – 关系代数转换 – 生成逻辑计划 – 生成物理计划
(1) select 语句执行顺序:
from – on – join – where – group by – agg_func – with rollup或cube – having – select – distinct – order by – limit
(2) update 语句执行顺序:
from – where – set – update
缓冲区(Buffer):核心作用是用来缓冲。在输入输出设备和CPU之间存储数据,使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作,同时减少操作硬件的次数。
缓存区(Cache):核心作用是加快取用的速度。在CPU与内存间设置了作为CPU的数据快取区。解决CPU运算速度太快导致内存的数据存取速度无法跟上CPU速度的问题。
软解析:首先判断是否存在数据缓冲区,如果存在且可用,则直接获取该数据而不是从数据文件中去查询。
硬解析:若数据不在缓冲区缓存中,查看数据缓冲区块头是否有事务(数据缓冲区有事务,称为热点块)。如果有,则需要从回滚段(undo)中读取数据,(一致性读取,逻辑读)。如果没有,则比较select的SCN和热点块的SCN号码,如果前者小于后者则仍需要从undo回滚段中读取,如果前者大于后者说明这是一段非脏数据缓存,直接读取就可以。
(1) 连接数据库,由连接器负责跟客户端建立连接、获取权限、维持和管理连接。
首先,客户端通过TCP协议与数据库端口建立连接,此时监听线程dm_lsnr_thd在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程dm_wrkgrp_thd的任务队列,等待工作线程进行处理。
(2) 语法检查
主要是对SQL语句的语法和拼写进行检查,看其是否合乎语法规则。不符合则不再进行,直接返回语法错误。
(3) 语义检查
检查SQL语句中的访问对象是否存在及该用户是否具备相应的权限。达梦也遵循“先解析SQL语句,把小写字母转换成大写字母再执行”的规则。先将表名字转换为大写,去对象字典中查询是否存在,如果存在进行下一步对sql语句涉及的表、字段、视图、索引等对象进行解析,如果不存在,则直接报错对象不存在返回客户端。
(4) 语句解析
客户端会话链接缓存在达梦数据库的会话内存池 (SESS_POOL,相当Oracle的PGA中的UGA),即用户线程的信息存储到会话内存池,完成三次握手。会话建立完成以后,SQL语句通过服务器进程传递给实例,然后在共享池进行判断走软分析还是硬分析。然后通过数据字典找出该SQL语句涉及的表属于哪一个表空间,行属于表空间的哪一个数据文件中,(数据字典也是属于共享池的一个数据缓冲区),然后进行一个取行的工作,最后在NORMAL数据缓冲区中判断要取的数据是否缓存。
语句解析即分析器主要有以下任务:
(5) 优化器
CBO通过计算各种可能的执行计划的“代价”,即COST,从中选用COST最低的执行方案作为实际运行方案,这里影响CBO的因素有很多,除了统计信息之外还有索引、数据分布、高水位线、聚簇因子、系统资源竞争等。CBO根据各方面因素寻找最低代价的执行计划生成最终的执行计划。
(6) 执行器。接受CBO的执行计划树,执行。
(7) 封装结果集。将执行的结果集封装后通过I/O线程缓存后返回客户端。
(8) 断开连接、释放资源。执行完毕根据相关参数设置对线程资源进行释放。
当收到SQL请求时,数据从磁盘加载到内存的数据缓冲区,有三种数据流向情况:
(1) 数据库进程先在SQL缓冲区中,查找计划缓存。如果存在计划缓存,则查找结果集缓存。如果存在结果集缓存,则直接生成结果集。
(2) 数据库进程先在SQL缓冲区中,查找计划缓存。如果存在计划缓存,则查找结果集缓存。如果不存在结果集缓存,则在数据缓冲区中按照缓存的计划执行。请求SQL语句分为增删改语句和查询语句。对于SELECT查询语句,执行完缓存计划后直接生成结果集。对于INSERT/DELETE/UPDATE增删改语句,执行完缓存计划后,要进行日志刷盘,在日志缓冲区存放重做日志,将新数据从内存持久化到磁盘。
(3) 数据库进程先在SQL缓冲区中,查找计划缓存。如果不存在计划缓存,则先在字典缓冲区解析缓存计划,生成执行计划后,再将执行计划缓存回SQL缓冲区,接着按照计划执行。对于SELECT查询语句,执行完计划后直接生成结果集。对于INSERT/DELETE/UPDATE增删改语句,执行完计划后,进行日志刷盘,在日志缓冲区存放重做日志,将新数据从内存持久化到磁盘。
本文简单介绍达梦数据库的内存结构和SQL执行相关知识,帮助初学者理解SQL请求及数据在DM内存结构中如何进行加载解析输出。文中只列举部分参数,有需要可以在达梦官网下载《DM8系统管理员手册》进行阅读以及更深入的学习。
如果文中有误,欢迎指出,大家共同交流进步!
更多达梦技术资讯,请访问达梦技术社区:
达梦数据库 - 新一代大型通用关系型数据库 | 达梦云适配中心
https://eco.dameng.com/
文章
阅读量
获赞