欢迎光临
我们一直在努力

达梦和Oracle归档产生量对比

1、概述

本文主要测试在事务数量相同的情况下,达梦数据库产生的归档日志大小是否与Oracle数据库产生的归档日志大小一致,并基于该问题开展测试验证。

2、测试软件

达梦数据库和Oracle数据库机器配置均为4C8G,正常写单个归档日志大小均配置为256M。

数据库

数据库版本

初始化参数

达梦数据库

DM V8.1.4.170 pack11

页大小:32K,簇大小:32页,字符集GBK,大小写敏感,开启空格填充,兼容Oracle

Oracle数据库

19c

块大小:8K,字符集GBK

3、测试表及数据

3.1、表结构设计

创建一个包含常见数据类型的测试表,模拟真实业务表

create table test_archive (
 id number(10) primary key,
 vc_data varchar2(200),
 n_data number(18,2),
 d_data date default sysdate,
 clob_data clob,
 blob_data blob
);

3.2、基础测试数据生成

预先插入一批基础数据,作为后续更新/删除的目标。这里插入100000 行。

begin
 for i in 1..100000 loop
 insert into test_archive (id,vc_data,n_data,d_data) values (i,'Initial data '||i,round(dbms_random.value(1,1000),2),sysdate-dbms_random.value(1,365));
 end loop;
 commit;
end;
/

4、模拟事务脚本

这里设计一个混合DML事务负载,包含插入、更新、删除操作,并按固定间隔提交。脚本每轮循环执行一组操作,总事务数可根据需要设定。

4.1、变量定义

v_total_txns:总事务数(例如 10000)

v_commit_freq:每N个事务提交一次(即每循环一次提交一次)

可调整v_commit_freq为每N条DML提交一次,观察不同提交频率对归档量的影响。

4.2、脚本逻辑

–脚本说明:
(1)每个事务执行一次插入和一次更新,偶尔执行一次删除(模拟混合负载)。
(2)提交频率设置为每5个事务提交一次(最常规模式),可修改v_commit_freq为10、100等观察差异。
(3)使用随机函数保证操作分布均匀。
declare
 v_total_txns constant pls_integer:=10000; –总事务数 = 插入条数
 v_commit_freq constant pls_integer:=5;–每5个事务提交一次
 v_counter pls_integer:=0;
 v_max_id pls_integer;
 v_start_id pls_integer;
 v_rand_id pls_integer;
BEGIN
 –获取当前最大ID,用于新插入行
 select nvl(max(id),0) into v_max_id from test_archive;
 v_start_id:=v_max_id + 1;
 for i in 1..v_total_txns loop
   –操作1:插入一条新记录(每个循环都插入)
   insert into test_archive (id,vc_data,n_data,d_data) values (v_start_id + i – 1,'Txn insert '||to_char(systimestamp,'YYYYMMDDHH24MISSFF'),round(dbms_random.value(1,10000),2),sysdate);
   –操作2:随机更新一条已存在的记录(每1000次循环执行一次,共10次)
   if mod(i, 1000) = 0 then
     v_rand_id:=round(dbms_random.value(1,100000)); –假设基础数据id 1-100000
     update test_archive set vc_data='Updated at '||to_char(systimestamp,'YYYYMMDDHH24MISSFF'),n_data=round(dbms_random.value(1,10000),2) where id=v_rand_id;
   end if;
   –操作3:随机删除一条较老的记录(每100次循环执行一次,共100次)
   if mod(i, 100) = 0 then
     v_rand_id:=round(dbms_random.value(1,100000));
     delete from test_archive where id=v_rand_id;
   end if;
   –按设定频率提交
   v_counter:=v_counter + 1;
   if v_counter >= v_commit_freq then
     commit;
     v_counter:=0;
   end if;
 end loop;
 –最终提交剩余事务
 commit;
end;
/

5、测试归档产生量

5.1、测试步骤

(1)在测试前分别切换一次Oracle和达梦数据库的归档,并记录当前最新的归档日志的起始位置和大小。

Oracle数据库:

— 查询当前可用的归档日志(未被删除)
select sequence#,name,blocks*block_size/1024/1024 as size_mb,completion_time,deleted,status from v$archived_log where deleted='NO' and status='A' order by sequence#;
alter system checkpoint;
alter system switch logfile;
select sequence#,name,blocks*block_size/1024/1024 as size_mb,completion_time,deleted,status from v$archived_log where deleted='NO' and status='A' order by sequence#;
select round(sum(blocks*block_size/1024/1024),0) as size_mb from v$archived_log where deleted='NO' and status='A';

达梦数据库:

select path,len/1024/1024 from v$arch_file;
select checkpoint(100);
alter system switch logfile;
select path,len/1024/1024 from v$arch_file;
–达梦数据库需要根据实际情况判断最后一个归档大小是否统计在内
–统计所有归档
select round(sum(len)/1024/1024,0) as total_size_mb from v$arch_file;
–不统计最后一个归档大小
select round(sum(blocks*block_size/1024/1024),0) as size_mb from v$archived_log where deleted='NO' and status='A';

(2)执行前述模拟事务的脚本

(3)测试结束后,再次查询归档日志的总大小,计算差值(结束总量 – 开始总量)。

Oracle数据库:

select sequence#,name,blocks*block_size/1024/1024 as size_mb,completion_time,deleted,status from v$archived_log where deleted='NO' and status='A' order by sequence#;
alter system checkpoint;
alter system switch logfile;
select round(sum(blocks*block_size/1024/1024),0) as size_mb from v$archived_log where deleted='NO' and status='A';

达梦数据库:

select PATH,LEN/1024/1024 from v$arch_file;
select checkpoint(100);
alter system switch logfile;
select path,len/1024/1024 from v$arch_file;
–达梦数据库需要根据实际情况判断最后一个归档大小是否统计在内
–统计所有归档
select round(sum(len)/1024/1024,0) as total_size_mb from v$arch_file;
–不统计最后一个归档大小
select round(sum(blocks*block_size/1024/1024),0) as size_mb from v$archived_log where deleted='NO' and status='A';

5.2、注意事项

(1)确保测试期间数据库只有该测试负载,无其他事务产生归档。

(2)如果归档日志自动删除,需保证测试期间归档保留完整。

(3)可以多次运行测试,取平均值,减少偶然误差。

6、测试结果

模拟事务数

数据库类型

归档日志增长量(MB)

10000

DM

5

Oracle

10

50000

DM

24

Oracle

50

100000

DM

49

Oracle

102

500000

DM

236

Oracle

509

1000000

DM

474

Oracle

1026

单个事务单表插入100W条数据

DM

212

Oracle

797

7、总结

同等事务量情况下,达梦数据库产生的归档日志量比Oracle少,综合来看,达梦产生的归档日志量大概为Oracle的一半。

赞(0)
未经允许不得转载:171主机测评 » 达梦和Oracle归档产生量对比
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址