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的一半。


