数据库:数据库其实就是一堆数据文件,存放在磁盘上
实例:内存和进程组成
数据库—>用户/模式—>表空间—>段—>簇—>页
图1.1 表空间、数据文件、段、簇、页的关系
1. 数据库有一个或多个数据文件组成
2. 表空间有一个或多个数据文件组成
3. 数据文件有一个或多个簇组成
4. 段是簇的上级逻辑单元,一个段可以跨多个数据文件
5. 簇是有同一个数据文件中16个,32个,64个连续的数据页组成,一个簇总在一个数据文件中
6. 页是数据中最小的分配单元和I/O单元
在DM数据库中,表空间是有一个或者一堆文件组成,数据库中所有的对象逻辑上都存放在表空间中,物理上都存储在所属表空间的数据文件中。
表空间:
普通表空间:不能存储huge表
混合表空间:同时存储普通表和huge表
每个用户都有一个默认的表空间,对于sys,syssso,syssuditor,默认的表空间是system,sysdba的默认表空间是main。新创建的用户未指定表空间时,则系统默认使用的是main表空间。
在创建 DM 数据库时,系统会自动创建 5 个表空间:SYSTEM 表空间、ROLL 表空间、RLOG 表空间、MAIN 表空间和 TEMP 表空间。
1.SYSTEM 表空间存放了有关 DM 数据库的字典信息,用户不能创建表和索引。又称为系统表空间。
2.ROLL 表空间完全由 DM 数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行 DML操作之前的值,提供表数据的读一致性视图。ROLL 文件用于保存系统的回滚记录,提供事务回滚时的信息。
3.RLOG 表空间称为日志表空间,初始化库时会自动创建 2 个后缀名为 log 的日志文件,用于存放重做日志,用户可主动添加或者扩展日志文件,可循环使用。
4.MAIN 表空间在初始化库的时候,会自动创建一个大小为 128M 的数据文件 MAIN.DBF,以及一个 HMAIN 目录作为 HUGE 数据文件路径,是混合表空间。在创建用户时,未指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
5.TEMP 表空间完全由 DM 数据库自动维护。分配临时段。如创建索引,排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间。
段是簇的上级逻辑存储单元。有一组簇组成。一个段可以跨越不同的文件,但是一个簇或者簇对应的数据页只能来自同一个文件,是连续的16,32,64个数据页,由于簇是按需分配的,数据段中的不同簇在磁盘上不一定连续。
数据段:表数据段和索引数据段。DM是按照簇给每个数据段分配空间,当数据段的簇空间用完时,DM就给该段重新分配新的簇。对于分区表:每个分区使用单独的数据段来存储数据,对于分区表上的非分区索引,使用索引数据段来容纳所有数据,对于分区索引,每个分区使用一个单独的索引数据段来容纳数据。
临时段:存储在临时表空间中。在排序操作和创建临时表/索引时候,会使用临时表。
回滚段:保存用于恢复数据库操作的信息。采用了全自动回滚管理机制来管理信息和回滚表空间。还采用了延迟段分配的功能,就是在创建表或索引时先不分配空间,当插入数据时候,才申请分配存储空间,可以通过设置 ini 参数 DEFERRED_SEGMENT_CREATION=1 开启延迟段分配功能。
未提交的事务:执行回滚语句时,回滚记录被用来做回滚变更
数据库恢复阶段:回滚记录被用来做所有未提交变更的回滚
多个并发事务运行期间:提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到事务提交。
簇是页的上级逻辑存储单元。由同一个数据文件中16个,32个,64个连续的数据页组成,簇的大小有用户在创建数据库时候指定,默认是16。
当新创建表或索引的时候,DM数据库会为表或索引的数据段自动分配至少一个簇,同时会生成对应数量的空闲数据页,如果分配空闲数据页用完,或者新插入的的数据需要更多的空间,DM将分配新的簇。当为新的簇分配空闲空间时,按照数据文件从小到大的顺序寻找可用的空闲簇分配;如果没有,查找数据文件有足够空闲空间的,然后格式化分配;如果都没有,则新加数据文件分配。
当用户执行drop操作之前时,该表对应的数据段至少会保留一个簇不被回收到表空间,在执行delete操作时,DM数据库通过修改数据文件中的位图来释放簇,释放后的簇被称为空闲簇,可以供其他对象使用。当删除了表中的所有记录时,DM数据库仍会保留1-2个簇
当drop表时,则此表中对应的数据段和段中包换的簇全部收回。
数据页(也称数据块)是 DM 数据库中最小的数据存储单元。页大小可以为 4KB、8KB、16KB或者 32KB,用户在创建数据库时可以指定,默认大小为 8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。
页包括页头控制信息,数据,空闲空间,行偏移数组
FILLFACTOR参数:
1. 在创建表/索引时指定该参数,它指定一个数据页初始化后插入数据时最大可以使用的空间百分比。
2. 使用 FILLFACTOR 时应该在空间和性能之间进行权衡对于dba来说,因为高值(100)会频繁引起页分裂, I/O 操作多但是节省了空间;低值(但不是过低)可以尽量避免数据页的分裂,提升 I/O 性能,但空间利用率低。
我们知道oracle的内存结构包括3块:系统全局区(sga),程序全局区(pga),用户全局区(uga)
SGA:是共享的内存结构.有share pool,large pool,java pool,stream pool,database buffer cache,redo log buffer(重做日志缓冲区)
PGA:用于全局区,由每个服务进程、后台进程专有;每个进程都有一个PGA。
UGA:用户全局区,主要是用来保存用户会话信息和用户结果排序。
图1.1 oracle的内存结构
而在达梦中内存结构主要包括内存池、缓冲区、排序区、哈希区:
图1.2 达梦的内存结构
DM8为哈希连接设定的缓冲区,实际上使用的内存区域还是内存池来进行哈希操作
排序缓冲区是提供数据排序所使用的内存空间,当使用sql语句进行排序时候,使用的就是排序缓冲区提供的,在每次排序过程中,都需要申请内存(我认为申请的这个内存还是内存池的),排序结束内存释放。
数据缓冲区:是DM SERVER最重要的内存区域之一。该缓冲区是将数据页写入磁盘之前或者从磁盘上读取数据页之后。库启动后,数据缓冲区向操作系统申请一大片连续的内存并将其按照数据页大小进去格式化,并置入自由链中。该链分为3类。
数据缓冲区的4种类型:
RECYCLE 缓冲区供临时表空间使用,
FAST 缓冲区根据用户指定的 FAST_POOL_PAGES 大小由系统自动进行管理
NORMAL 缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为 NORMAL;
KEEP 的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去,主要针对用户的应用是否需要经常处在内存当中,如果是这种情况,可以指定缓冲区为 KEEP。
日志缓冲区:日志缓冲区主要是存放重做日志的内存缓冲区,DM在运行过程中产生的日志不会立即写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中
字典缓冲区:该缓冲区主要缓冲一些数据字典信息,模式信息、表信息、列信息、触发器信息等。DM8 采用的是将部分数据字典信息加载到缓冲区中,并采用 LRU 算法进行字典信息的控制。
SQL缓冲区:该缓冲区主要是缓存sql结果,执行计划,SQL语句。 dm.ini文件中 USE_PLN_POOL=1表示启用;0表示禁用。CACHE_POOL_SIZE来改变 SQL 缓冲区大小,默认是200M
文章
阅读量
获赞