从Page结构来看达梦数据库是不是纯自研

说到达梦数据库,很多人以为都是基于Oracle 8i或者9i的代码copy的;实际上从测试来看并不是这样。这里我要说明,达梦没有给我一毛钱,我不是打广告。这里我通过简单的例子来对了一下窥视:

SQL> create table killdb(a number,b varchar2(200)) tablespace enmotech;
executed successfully
used time: 3.444(ms). Execute id is 212.
SQL> 
SQL> insert into killdb values(5,'www.killdb.com');
affect rows 1
 
used time: 0.525(ms). Execute id is 213.
SQL> commit;
executed successfully
used time: 0.974(ms). Execute id is 214.
 
SQL> select segment_name,SEGMENT_TYPE,HEADER_FILE,HEADER_BLOCK,BYTES,BLOCKS,EXTENTS,INITIAL_EXTENT,MAX_EXTENTS,FREELISTS,FREELIST_GROUPS from dba_Segments where segment_name='KILLDB';
 
SEGMENT_NAME SEGMENT_TYPE HEADER_FILE HEADER_BLOCK BYTES                BLOCKS               EXTENTS              INITIAL_EXTENT       MAX_EXTENTS          FREELISTS FREELIST_GROUPS
------------ ------------ ----------- ------------ -------------------- -------------------- -------------------- -------------------- -------------------- --------- ---------------
KILLDB       TABLE        0           48           262144               32                   2                    131072               2147483645           NULL      NULL
 
used time: 268.345(ms). Execute id is 215.
SQL> 
SQL>  DECLARE
2   INFO DBMS_PAGE.DPH_ARR_T;
3       BEGIN
   INFO = NEW DBMS_PAGE.DPH_T[1];
   DBMS_PAGE.DATA_PAGE_HEAD_LOAD(5,0,48,INFO[1]);
   SELECT * FROM ARRAY INFO;
   END;
4   5   6   7   8     /
 
N_SLOT      N_REC       HEAP_LOW    HEAP_HIGH   BRANCH_NO   FREE_LIST_OFF REC_MIN_OFF REC_MAX_OFF EXTERNAL    USED_TINYINT
----------- ----------- ----------- ----------- ----------- ------------- ----------- ----------- ----------- ------------
3           1           138         0           0           NULL          82          90          NULL        152
 
used time: 0.764(ms). Execute id is 216.
SQL> 
SQL>  DECLARE
2   HEAD DBMS_PAGE.DPH_T;
3   INFO dbms_page.REC_ARR_T;
4   BEGIN
5   DBMS_PAGE.DATA_PAGE_HEAD_LOAD(5,0,48,HEAD);
6   INFO = NEW dbms_page.REC_T[HEAD.N_REC];
7   FOR I IN 1..HEAD.N_REC LOOP
8   DBMS_PAGE.DATA_PAGE_REC_BY_SLOT_NO_LOAD(5,0,48,I,INFO[I]);
9   END LOOP;
10  SELECT * FROM ARRAY INFO;
11  END;
/12  
 
SLOT_NO     OFFSET      LEN         IS_DEL      TRX_ID               CLU_ROWID            ROLL_ADDR_FILE ROLL_ADDR_PAGE ROLL_ADDR_OFF
----------- ----------- ----------- ----------- -------------------- -------------------- -------------- -------------- -------------
1           98          40          0           6029                 1                    NULL           NULL           NULL
 
used time: 0.742(ms). Execute id is 223.
SQL> set long 9999
SQL> SP_TABLEDEF('SYSDBA','KILLDB');
 
COLUMN_VALUE
-------------------------------------------------------------------------------------------------------
CREATE TABLE "SYSDBA"."KILLDB" ( "A" NUMBER, "B" VARCHAR2(200)) STORAGE(ON "ENMOTECH", CLUSTERBTR) ;
 
used time: 0.427(ms). Execute id is 310.
SQL> select dump(a,b) from killdb;
select dump(a,b) from killdb;
[-6111]:Fail to cast string.
used time: 0.652(ms). Execute id is 0.
SQL> select dump(a) from killdb;
 
DUMP(A)           
------------------
Typ=9 Len=2: 193,6
 
used time: 0.575(ms). Execute id is 225.
SQL> select dump(b) from killdb;
 
DUMP(B)                                                          
-----------------------------------------------------------------
Typ=2 Len=14: 119,119,119,46,107,105,108,108,100,98,46,99,111,109
 
used time: 0.527(ms). Execute id is 226.
SQL> select group_id,id,path,page_size,FREE_PAGE_NO from v$datafile;
 
GROUP_ID    ID          PATH                                        PAGE_SIZE   FREE_PAGE_NO        
----------- ----------- ------------------------------------------- ----------- --------------------
0           0           /opt/dm/dmdbms/data/enmotech/SYSTEM.DBF     8192        1808
1           0           /opt/dm/dmdbms/data/enmotech/ROLL.DBF       8192        1488
3           0           /opt/dm/dmdbms/data/enmotech/TEMP.DBF       8192        16
4           0           /opt/dm/dmdbms/data/enmotech/MAIN.DBF       8192        48
5           0           /opt/dm/dmdbms/data/enmotech/enmotech01.dbf 8192        64
 
used time: 0.663(ms). Execute id is 229.
SQL>  select id,path,MODIFY_TRX from v$datafile;
 
ID          PATH                                        MODIFY_TRX          
----------- ------------------------------------------- --------------------
0           /opt/dm/dmdbms/data/enmotech/SYSTEM.DBF     6029
0           /opt/dm/dmdbms/data/enmotech/ROLL.DBF       6029
0           /opt/dm/dmdbms/data/enmotech/TEMP.DBF       6029
0           /opt/dm/dmdbms/data/enmotech/MAIN.DBF       6029
0           /opt/dm/dmdbms/data/enmotech/enmotech01.dbf 6029
 
used time: 0.577(ms). Execute id is 308.
SQL> 
SQL> select owner,object_name,OBJECT_ID,OBJECT_TYPE,STATUS from dba_objects where object_name='KILLDB';
 
OWNER  OBJECT_NAME OBJECT_ID OBJECT_TYPE STATUS
------ ----------- --------- ----------- ------
SYSDBA KILLDB      1282      TABLE       VALID
 
used time: 7.276(ms). Execute id is 232.
 
SQL> select dump(1282) from dual;
 
DUMP(1282)          
--------------------
Typ=7 Len=4: 2,5,0,0
 
dmdba@test25:~#   dd if=/opt/dm/dmdbms/data/enmotech/enmotech01.dbf bs=8192 skip=48 count=1|od -x
1+0 records in
1+0 records out
8192 bytes (8.2 kB) copied, 6.4457e-05 s, 127 MB/s
0000000 0005 0000 0030 0000 ffff ffff ffff ffff
0000020 ffff ffff 0014 0000 0000 0000 a9af 0000
0000040 0000 0000 0003 008a 0000 0000 0001 ffff
0000060 0052 005a ffff 0098 0000 03ff 0200 0005    
0000100 0000 0008 0000 010c 0005 0000 0008 0000
0000120 00c4 0000 0000 0000 0000 ffff ffff ffff
0000140 ffff 2800 8200 06c1 778e 7777 6b2e 6c69  
0000160 646c 2e62 6f63 016d 0000 0000 ff00 ffff
0000200 7fff ffff 178d 0000 0000 0000 0000 0000
0000220 0000 0000 0000 0000 0000 0000 0000 0000
*
0017760 0000 005a 0062 0052 0000 0000 0000 0000
0020000
dmdba@test25:~#

由于x86这里是反向存储,因此c1 06即a列dump value 196,6

778e 7777 6b2e 6c69 646c 2e62 6f63 016d 转换后为:8e77 7777 2e6b 696c 6c64 622e 636f 6d01

其中的77 7777 2e6b 696c 6c64 622e 636f 6d即为我们的数据 www.killdb.com,长度为14。

从dump的page header信息来看,其中:

0005 中 05表示tablespace id 05

第3,4 偏移量为file id 00 00

第6,7偏移量 0030为段头的header page地址,即48

178d 为最近一次修改的事务ID 6029. 类似Oracle checkpoint 。

从dump page的结果来看,在page的尾部没有类似Oracle一样的tail校验机制(block头scn的低位的后4位+block type+seq = block尾部的tail值). 因此从这里也能看出一个问题,如果使用了大于4k的page size,那么达梦数据库也存在partial write问题;换句话说达梦数据库也不支持原子写,而且还没有类似Oracle一样的严格的校验机制。

因此从物理结构来看与Oracle 完全不同,实际上Oracle 8i开始的block结构并没有太大的变化。

所以我认为达梦数据库应该是纯自研,猜测达梦是基于Oracle 8i/9i的说法应该可以洗洗睡了。

不过从相关视图的查询结果来看,达梦基于o的兼容是基于Oracle 12.1进行的。

最后简单总结一下这个小测试得到的几个结论:

1、达梦数据库默认创建的table是簇表,也就是索引组织表,也可以创建为普通堆表;可以参考之前写的文章 达梦数据库学习笔记-表与分区表

2、达梦不支持原子写,也存在partial write问题;

3、达梦不存在类似Oracle一样针对block的严格校验机制(之前已写过类似文章 达梦数据库学习笔记 -达梦IO写入性能与partial write

4、达梦数据page的结构与Oracle block 结构完全不同,其page头部即存在tablespace id+ file id + header page number;

但是page中的行数据存放格式跟oracle一样,也是row头存放列长度+type+row数据的模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
达梦数据库常⽤系统视图及查询语句 ⼀、常⽤的系统视图: dba_objects:显⽰数据库中所有的对象,例如想查询数据库中有没有某个对象 v$sessions:显⽰会话的具体信息,如执⾏的 sql 语句、主库名、当前会话状态、⽤户名等等 v$lock:查看当前数据库中锁的信息 v$mem_pool:显⽰所有的内存池信息 V$deadlock_histor::记录死锁的历史信息 V$TABLESPACE:显⽰表空间信息,不包括回滚表空间信息 V$TRX:显⽰所有活动事务的信息。通过该视图可以查看所有系统中所有的事务以及相关信息,如锁信息等。 ⼆、常⽤查询语句 1、查询数据库在线实例信息 select distinct NAME, HOST_NAME, SVR_VERSION, DB_VERSION, START_TIME, STATUS$, MODE$ from V$INSTANCE; 2、查看数据库常⽤参数值 select PARA_NAME,PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN('MEMORY_POOL','BUFFER','PORT_NUM','MAX_SESSIONS','MAX_SESS ION_STATEMENT','INSTANCE_NAME','BAK_PATH','SYSTEM_PATH','ARCH_INI'); 3、查询数据库初始化配置 select SF_GET_PAGE_SIZE() page_size, SF_GET_EXTENT_SIZE() extent_size, SF_GET_UNICODE_FLAG() unicode_flag, SF_GET_CASE_SENSITIVE _FLAG() case_sensitive_flag, SF_GET_SYSTEM_PATH() system_path; 4、查询数据库名称、数据库总⼤⼩、数据库是否启⽤归档 select NAME,STATUS$,ARCH_MODE, TOTAL_SIZE from SYS.V$DATABASE; 5、查询数据库连续运⾏时间 select (SYSDATE-START_TIME)*24 FROM V$INSTANCE; 6、查询数据库管理⽤户状态,默认表空间,是否存在被锁定 select D.USERNAME,A.CREATED,D.ACCOUNT_STATUS,D.DEFAULT_TABLESPACE,D.EXPIRY_DATE,D.LOCK_DATE FROM DBA_USERS D,ALL_USE RS A; 7、查询当前数据库的⽇志分组情况 select GROUP_ID,FILE_ID,PATH,CLIENT_PATH,RLOG_SIZE FROM SYS.V$RLOGFILE; 8、查询表空间信息 select T.NAME 表空间名称, D.PATH 表空⽂件路径, T.TYPE$ 表空间类型, T.STATUS$ 表空间状态, T. FILE_NUM 包含的⽂件数, D.TOTAL_SIZE*16/1024 总⼤⼩, D.FREE_SIZE*16/1024 空闲⼤⼩, TRUNC((TRUNC(D.TOTAL_SIZE-D.FREE_SIZE, 4)/D.TOTAL_SIZE)*100, 2) 使⽤率 FROM V$TABLESPACE T, V$DATAFILE D WHERE "GROUP_ID"=T.ID; 9、查询数据表所分配的空间⼤⼩,辅助查询表⽤户使⽤情况 select OWNER,TABLESPACE_NAME,SEGMENT_TYPE,SEGMENT_NAME,BLOCKS,BYTES/1024/1024 FROM DBA_SEGMENTS ORDER BY OWNER,SE GMENT_NAME; 10、查询表索引状态,便于确认表索引是否可⽤ select I.TABLE_OWNER,I.TABLE_NAME,O.OBJECT_NAME,O.OBJECT_TYPE,O.STATUS FROM USER_INDEXES I,USER_OBJECTS O WHERE O.OBJE CT_NAME=I.INDEX_NAME AND O.STATUS='INVALID'; 11、查询数据库归档信息 select ARCH_TYPE,ARCH_DEST FROM V$DM_ARCH_INI; select ARCH_NAME, ARCH_TYPE, ARCH_DEST, ARCH_FILE_SIZE, ARCH_SPACE_LIMIT, ARCH_TIMER_NAME, ARCH_IS_VALID from SYS.V$DM_AR CH_IN
根据提供的引用内容,我们可以得知达梦数据库在SpringBoot中没有像MySQL那样的集成,但是我们可以通过引入达梦数据库驱动来实现集成。而在MyBatis中,我们可以使用pagehelper插件来实现分页查询。因此,我们可以通过以下步骤来实现达梦数据库集成pagehelper: 1. 在pom.xml文件中引入pagehelper和达梦数据库驱动的依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>com.dameng</groupId> <artifactId>dameng</artifactId> <version>8.1.5.29</version> </dependency> ``` 2. 在application.properties文件中配置达梦数据库的连接信息: ```properties spring.datasource.url=jdbc:dm://localhost:5236 spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver ``` 3. 在MyBatis的配置文件中配置pagehelper插件: ```xml <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="dm"/> </plugin> </plugins> ``` 4. 在Mapper接口中使用pagehelper插件提供的PageHelper.startPage方法来实现分页查询: ```java import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; public interface UserMapper { List<User> selectAll(); default Page<User> selectByPage(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); return (Page<User>) selectAll(); } } ``` 以上就是达梦数据库集成pagehelper的步骤。如果你想了解更多关于pagehelper的使用方法,可以参考官方文档:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值