本次测试在DM索引组织表、DM堆表、ORACLE堆表,分布对比创建就表后直接将创建索引写入数据、创建表后先写入数据再创建索引情况下的归档生成量差别。
CPU:x86_64 4C
操作系统:kylin V10SP3
内存:6684
数据库版本:8.1.5.60 03134284552-20260414-322369-20221
初始化参数:extent_size=32 page_size=32 charset=0 case_sensitive=1 blank_pad_mode=1
#其他参数依据参数优化脚本V5.6进行调整
–创建业务用户:
create tablespace "OUSHIN" datafile '/data/dmdata/OUSHIN01.DBF' size 128 autoextend on maxsize 102400;
create user "OUSHIN" identified by "Dameng123!" default tablespace "OUSHIN" default INDEX TABLESPACE "OUSHIN";
grant RESOURCE,PUBLIC,VTI,SOI,SVI to "OUSHIN";
–创建表(使用 OUSHIN 表空间,参考金蝶ERP创建的普通表,名称TMP开头)
--索引组织表
CREATE TABLE "OUSHIN"."TMP_AJE9IRYM4FEO0"
(
"FID" BIGINT,
"FVERSION" INT NOT NULL
)
STORAGE(ON "OUSHIN", CLUSTERBTR); -- 指定使用 OUSHIN 表空间
--堆表
CREATE TABLE "OUSHIN"."TMP_AJE9IRYM4FEO0"
(
"FID" BIGINT,
"FVERSION" INT NOT NULL
)
STORAGE(ON "OUSHIN", BRANCH(64,64));
–创建索引(也存储在 OUSHIN 表空间)
CREATE OR REPLACE INDEX "OUSHIN"."IDX_TMP_AJE9IRYM4FEO0_FID"
ON "OUSHIN"."TMP_AJE9IRYM4FEO0"("FID" ASC)
STORAGE(ON "OUSHIN", CLUSTERBTR);
CREATE OR REPLACE INDEX "OUSHIN"."IDX_TMP_AJE9IRYM4FEO0_FVERSION"
ON "OUSHIN"."TMP_AJE9IRYM4FEO0"("FVERSION" ASC)
STORAGE(ON "OUSHIN", CLUSTERBTR);
SELECT INDEX_NAME,TABLE_NAME,TABLESPACE_NAME
FROM DBA_INDEXES
WHERE OWNER='OUSHIN' AND TABLE_NAME='TMP_AJE9IRYM4FEO0';
–创建堆表索引
CREATE OR REPLACE INDEX "OUSHIN"."IDX_TMP_AJE9IRYM4FEO0_FID" ON "OUSHIN"."TMP_AJE9IRYM4FEO0"("FID" ASC) TABLESPACE "OUSHIN";
CREATE OR REPLACE INDEX "OUSHIN"."IDX_TMP_AJE9IRYM4FEO0_FVERSION" ON "OUSHIN"."TMP_AJE9IRYM4FEO0"("FVERSION" ASC) TABLESPACE "OUSHIN";
SELECT INDEX_NAME,TABLE_NAME,TABLESPACE_NAME
FROM DBA_INDEXES
WHERE OWNER='OUSHIN' AND TABLE_NAME='TMP_AJE9IRYM4FEO0';
–查看索引
SELECT INDEX_NAME,TABLE_NAME,TABLESPACE_NAME
FROM DBA_INDEXES
WHERE OWNER='OUSHIN' AND TABLE_NAME='TMP_AJE9IRYM4FEO0';
–删除索引
DROP INDEX "OUSHIN"."IDX_TMP_AJE9IRYM4FEO0_FID";
DROP INDEX "OUSHIN"."IDX_TMP_AJE9IRYM4FEO0_FVERSION";
–插入数据语句(写入500w数据):
DECLARE
V_START_TIME TIMESTAMP;
V_BATCH_SIZE INT := 10000; -- 每批插入 1 万行
V_TOTAL INT := 0;
V_TARGET INT := 5000000; -- 目标总量:500万行
BEGIN
V_START_TIME := SYSDATE;
WHILE V_TOTAL < V_TARGET LOOP
INSERT INTO OUSHIN.TMP_AJE9IRYM4FEO0(FID, FVERSION)
SELECT
DBMS_RANDOM.VALUE(1, 9999999999), -- 随机 BIGINT
TRUNC(DBMS_RANDOM.VALUE(1, 1000))
FROM DUAL
CONNECT BY ROWNUM <= V_BATCH_SIZE;
V_TOTAL := V_TOTAL + V_BATCH_SIZE;
COMMIT; -- 每 1 万行提交一次
IF MOD(V_TOTAL, 100000) = 0 THEN
PRINT '已插入: ' || V_TOTAL || ' 行,已运行: ' || DATEDIFF(SECOND, V_START_TIME, SYSDATE) || ' 秒';
END IF;
END LOOP;
PRINT '========== 完成 ==========';
PRINT '总插入行数: ' || V_TOTAL;
PRINT '总耗时: ' || DATEDIFF(SECOND, V_START_TIME, SYSDATE) || ' 秒';
END;
/
SELECT COUNT(*) FROM OUSHIN.TMP_AJE9IRYM4FEO0;
–删除数据
DECLARE
i int;
begin
for i in 1..5000 loop
delete from OUSHIN.TMP_AJE9IRYM4FEO0 where rownum<=1000;
commit;
end loop;
end;
/
–查询归档量、表大小、ROLL使用情况
SELECT '当前归档总大小(MB): '||SUM(FREE) / 1024.0 / 1024.0 FROM V$ARCH_FILE UNION ALL
select '当前表大小(MB): '||TABLE_USED_SPACE('OUSHIN','TMP_AJE9IRYM4FEO0') /1024.0/1024*page UNION ALL
select '当前roll使用情况(MB): '||USED_SIZE/1024.0/1024*page from SYS.V$TABLESPACE where name='ROLL';
–删除归档
ALTER SYSTEM SWITCH LOGFILE;
SELECT SF_ARCHIVELOG_DELETE_BEFORE_TIME(SYSDATE - 1/1440);
–创建表空间
CREATE TABLESPACE OUSHIN
DATAFILE '/u01/app/oracle/oradata/XE/OUSHIN01.DBF'
SIZE 128M AUTOEXTEND ON MAXSIZE 20480M;
–创建业务用户
CREATE USER OUSHIN IDENTIFIED BY "Oracle123!"
DEFAULT TABLESPACE OUSHIN;
GRANT DBA TO OUSHIN;
–创建表
CREATE TABLE OUSHIN.TMP_AJE9IRYM4FEO0 (
FID NUMBER(19),
FVERSION NUMBER(10) NOT NULL
) TABLESPACE OUSHIN;
–创建索引
CREATE INDEX OUSHIN.IDX_TMP_AJE9IRYM4FEO0_FID
ON OUSHIN.TMP_AJE9IRYM4FEO0(FID ASC)
TABLESPACE OUSHIN;
CREATE INDEX OUSHIN.IDX_TMP_AJE9IRYM4FEO0_FVERSION
ON OUSHIN.TMP_AJE9IRYM4FEO0(FVERSION ASC)
TABLESPACE OUSHIN;
–删除索引
DROP INDEX OUSHIN.IDX_TMP_AJE9IRYM4FEO0_FID;
DROP INDEX OUSHIN.IDX_TMP_AJE9IRYM4FEO0_FVERSION;
–插入数据
SET SERVEROUTPUT ON;
DECLARE
V_START_TIME DATE;
V_BATCH_SIZE INT := 10000;
V_TOTAL INT := 0;
V_TARGET INT := 5000000; -- 目标500万行
V_SPAN NUMBER;
BEGIN
V_START_TIME := SYSDATE;
WHILE V_TOTAL < V_TARGET LOOP
INSERT INTO OUSHIN.TMP_AJE9IRYM4FEO0(FID, FVERSION)
SELECT TRUNC(DBMS_RANDOM.VALUE(1, 9999999999)),
TRUNC(DBMS_RANDOM.VALUE(1, 1000))
FROM DUAL
CONNECT BY ROWNUM <= V_BATCH_SIZE;
V_TOTAL := V_TOTAL + V_BATCH_SIZE;
COMMIT;
IF MOD(V_TOTAL, 100000) = 0 THEN
V_SPAN := (SYSDATE - V_START_TIME) * 86400;
DBMS_OUTPUT.PUT_LINE('已插入: ' || V_TOTAL || ' 行,已运行: ' || ROUND(V_SPAN) || ' 秒');
END IF;
END LOOP;
V_SPAN := (SYSDATE - V_START_TIME) * 86400;
DBMS_OUTPUT.PUT_LINE('--- 完成 ---');
DBMS_OUTPUT.PUT_LINE('总插入行数: ' || V_TOTAL);
DBMS_OUTPUT.PUT_LINE('总耗时: ' || ROUND(V_SPAN) || ' 秒');
END;
/
SELECT COUNT(*) FROM OUSHIN.TMP_AJE9IRYM4FEO0;
–更新数据
update OUSHIN.TMP_AJE9IRYM4FEO0 set FID=FID+1;commit ;
–删除数据
DECLARE
i int;
begin
for i in 1..10000 loop
delete from OUSHIN.TMP_AJE9IRYM4FEO0 where rownum<=1000;
commit;
end loop;
end;
/
–查看归档和表占用空间大小
EXEC DBMS_STATS.GATHER_TABLE_STATS('OUSHIN', 'TMP_AJE9IRYM4FEO0');
SELECT '当前归档总大小(MB): ' || ROUND(SUM(BLOCKS * BLOCK_SIZE) / 1024.0 / 1024.0, 2)
FROM V$ARCHIVED_LOG
WHERE DEST_ID = 1
AND DELETED='NO'
UNION ALL
SELECT '当前表大小(MB): '||(NUM_ROWS * AVG_ROW_LEN) / 1024 / 1024
FROM DBA_TABLES
WHERE OWNER = 'OUSHIN' AND TABLE_NAME = 'TMP_AJE9IRYM4FEO0'
;
–删除归档
--sqlplus
ALTER SYSTEM SWITCH LOGFILE;
SELECT GROUP#,BYTES/1024/1024 SIZE_MB,STATUS,ARCHIVED FROM V$LOG ORDER BY GROUP#;
--rman target /
DELETE NOPROMPT ARCHIVELOG ALL;
操作顺序:创建表->写入数据->创建索引
总插入行数: 5000000
插入数据后
插入索引后
总耗时:152s+9s+8s=169s
初始情况,归档总量0,表大小1MB,ROLL已使用83MB
写入数据后,归档总量637MB,表大小174MB,ROLL已使用83MB
创建索引后,归档总量860MB,表大小397MB,ROLL已使用83MB
无索引情况下,写入数据后归增量增加了637MB,表大小增加173MB,ROLL无变化;
创建索引后,归档量增加了223MB,表大小增加了223MB,ROLL无变化;
合计写入数据、创建索引归档量共增加了860MB,表大小397MB,ROLL无变化。
操作顺序:删除索引->清理归档->更新数据
更新数据
用时42s
删除索引、清理归档后,归档总量0MB,表大小174MB,ROLL已使用83MB
更新后归档总量554MB,表大小174MB,ROLL已使用384MB
无索引情况下,更新数据后归增量增加了554MB,表大小无变化,ROLL增加了301MB;
操作顺序:删除索引->清理归档->删除数据
删除数据用时2min 42s
删除索引、清理归档后,归档总量0MB,表大小174MB,ROLL已使用78MB
删除后归档总量4969MB,表大小1MB,ROLL已使用303MB
无索引情况下,删除数据后归增量增加了4969MB,表大小最终变到1MB,ROLL增加了225MB;
操作顺序:创建表->创建索引->写入数据
总插入行数: 5000000
总耗时: 404秒
初始归档总量0MB,表大小3MB,ROLL已使用83MB
写入数据后,归档总量6108MB,表大小542MB,ROLL已使用83MB
有索引情况下,写入数据后归增量增加了6108MB,表大小增加539MB,ROLL无变化;
操作顺序:清理归档->确认有索引->更新数据
用时2min11 s
更新后归档总量5287MB,表大小775MB,ROLL已使用384MB
有索引情况下,更新数据后归增量增加了5287MB,表大小增加233MB,ROLL增加301MB;
操作顺序:清理归档->确认有索引->删除数据
Deleete操作用时23mins51s
删除前归档总量0MB,表大小775MB,ROLL已使用384MB
删除后归档总量16409MB,表大小3MB,ROLL已使用456MB
有索引情况下,删除数据后归增量增加了16409MB,表大小减少至3MB,ROLL增加72MB;
操作顺序:创建表->写入数据->创建索引
总插入行数: 500万
总耗时: 151s+8s+9s=168s
初始情况,归档总量0,表大小9MB,ROLL已使用78MB
写入数据后,归档总量342MB,表大小315MB,ROLL已使用79MB
创建索引后,归档总量565MB,表大小538MB,ROLL已使用83MB
无索引情况下,写入数据后归增量增加了342MB,表大小增加304MB,ROLL增加1MB;
创建索引后,归档量增加了223MB,表大小增加了223MB,ROLL增加4MB;
合计写入数据、创建索引归档量共增加了565MB,表大小共增加527MB,ROLL增加5MB。
操作顺序:删除索引->清理归档->更新数据
更新数据
用时31s
删除索引、清理归档后,归档总量0MB,表大小315MB,ROLL已使用83MB
更新后归档总量554MB,表大小315MB,ROLL已使用384MB
无索引情况下,更新数据后归增量增加了554MB,表大小不变,ROLL增加301MB;
操作顺序:删除索引->清理归档->删除数据
删除数据
用时2min42s
删除索引、清理归档后,归档总量0MB,表大小315MB,ROLL已使用384MB
删除后归档总量614MB,表大小315MB,ROLL已使用605MB
无索引情况下,删除数据后归增量增加了614MB,表大小没变化,ROLL增加221MB;。
操作顺序:创建表->创建索引->写入数据
总插入行数: 5000000
总耗时:758s
初始归档总量0MB,表大小11MB,ROLL已使用83MB
写入数据后,归档总量10576MB,表大小756MB,ROLL已使用83MB
有索引情况下,写入数据后归增量增加了10576MB,表大小增加745MB,ROLL无变化;
操作顺序:清理归档->确认有索引->更新数据
用时3min4 s
初始归档总量0MB,表大小756MB,ROLL已使用83MB
更新后归档总量5308MB,表大小996MB,ROLL已使用384MB
有索引情况下,更新数据后归增量增加了5308MB,表大小增加240MB,ROLL大小增加301MB;
操作顺序:清理归档->确认有索引->删除数据
清理归档后,归档总量0MB,表大小996MB,ROLL已使用384MB
====
用时25min56s
初始归档总量0MB,表大小996MB,ROLL已使用384MB
删除后归档总量11022MB,表大小800MB,ROLL已使用405MB
有索引情况下,删除数据后归增量增加了11022MB,表大小减少196MB,ROLL增加21MB
操作顺序:创建表->写入数据->创建索引
总插入行数: 500万
总耗时: 42秒
写入数据后,归档总量108MB,表大小52MB,ROLL已使用130MB
创建索引后,归档总量294MB,表大小52MB,ROLL已使用130MB
无索引情况下,写入数据后归增量增加了108MB,表大小增加52MB,ROLL增加8MB;
创建索引后,归档量增加了186MB,表大小没变,ROLL无变化;
合计写入数据、创建索引归档量共增加了294MB,表大小增加52MB,ROLL增加8MB
操作顺序:删除索引->清理归档->更新数据
更新数据
用时2min6s
删除索引、清理归档后,归档总量0MB,表大小52MB,ROLL已使用130MB
更新后归档总量1564MB,表大小52MB,ROLL已使用728MB
无索引情况下,更新数据后归增量增加了1564MB,表大小不变,ROLL增加598MB;
操作顺序:删除索引->清理归档->删除数据
删除数据
用时7min38s
删除索引、清理归档后,归档总量0MB,表大小52MB,ROLL已使用728MB
删除后归档总量1274MB,表大小0MB,ROLL已使用622MB
无索引情况下,删除数据后归增量增加了1274MB,表大小减少至0MB,ROLL减少106MB;
操作顺序:创建表->创建索引->写入数据
总插入行数: 500万
总耗时:206秒
初始归档总量0MB,表大小0MB,ROLL已使用623MB
写入数据后,归档总量3108MB,表大小52MB,ROLL已使用1519MB
有索引情况下,写入数据后归增量增加了3108MB,表大小增加52MB,ROLL增加896MB;
操作顺序:清理归档->确认有索引->更新数据
用时2min40s
清理归档后,归档总量0MB,表大小52MB,ROLL已使用1519MB
更新后归档总量3741MB,表大小52MB,ROLL已使用3143MB
有索引情况下,更新数据后归增量增加了3741MB,表大小不变,ROLL增加1624MB;
操作顺序:清理归档->确认有索引->删除数据
用时11min32s
清理归档后,归档总量0MB,表大小52MB,ROLL已使用3143MB
删除后归档总量3922MB,表大小0MB,ROLL已使用3252MB
有索引情况下,删除数据后归增量增加了3922MB,表大小减少至0MB,ROLL增加109MB;
5.1 数据汇总
| DM组织索引表 | DM堆表 | ORACLE堆表 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 归档量 | 表大小 | ROLL | 归档量 | 表大小 | ROLL | 归档量 | 表大小 | ROLL | ||
| 无<br>索<br>引 | INSERT | 637 | 174 | 83 | 342 | 315 | 78→79 | 108 | 52 | 122→130 |
| UPDATE | 554 | 174 | 83→384 | 554 | 315 | 83→384 | 1564 | 52 | 130→728 | |
| DELETE | 4969 | 1 | 384→609 | 614 | 315 | 384→605 | 1274 | 0 | 728→622 | |
| 有<br>索<br>引 | INSERT<br>后建索引 | 860 | 397 | 83→83 | 565 | 538 | 79→83 | 294 | 52 | 130→130 |
| 建索引后<br>INSERT | 6108 | 542 | 83→83 | 10576 | 756 | 83→83 | 3108 | 52 | 623→1519 | |
| UPDATE | 5287 | 775 | 83→384 | 5308 | 996 | 83→384 | 3741 | 52 | 1519→3143 | |
| DELETE | 16409 | 3 | 384→456 | 11022 | 800 | 384→405 | 3922 | 0 | 3143→3252 |
#单位MB
#DM堆表无索引时delete数据后表大小不变,其他所有情况delete数据表大小均变小;
5.2 归档对比
| 操作 | 场景 | DM索引表 | DM堆表 | ORACLE堆表 |
|---|---|---|---|---|
| INSERT | 无索引insert | 637 | 342 | 108 |
| insert<br>后加索引 | 860 | 565 | 294 | |
| 有索引insert | 6108 | 10576 | 3108 | |
| UPDATE | 无索引update | 554 | 554 | 1564 |
| 有索引update | 5287 | 5308 | 3741 | |
| DELETE | 无索引delete | 4969 | 614 | 1274 |
| 有索引delete | 16409 | 11022 | 3922 |
#单位MB
https://eco.dameng.com
文章
阅读量
获赞
