注册
索引对归档量的影响测试
专栏/技术分享/ 文章详情 /

索引对归档量的影响测试

雾岛听风 2026/09/23 234 0 0
摘要

索引对归档量的影响测试v1

1 测试说明

本次测试在DM索引组织表、DM堆表、ORACLE堆表,分布对比创建就表后直接将创建索引写入数据、创建表后先写入数据再创建索引情况下的归档生成量差别。

2 测试环境

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进行调整

3 语句记录

3.1 DM

–创建业务用户:

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);

3.2 ORACLE

–创建表空间

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;

4 测试流程

4.1 索引组织表

4.1.1 无索引情况

INSERT

操作顺序:创建表->写入数据->创建索引

总插入行数: 5000000
image1.png
image2.png

插入数据后
image3.png

插入索引后

image4.pngimage5.png

总耗时: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无变化。
UPDATE

操作顺序:删除索引->清理归档->更新数据
image6.pngimage7.png

更新数据
image8.pngimage9.png

用时42s

删除索引、清理归档后,归档总量0MB,表大小174MB,ROLL已使用83MB

更新后归档总量554MB,表大小174MB,ROLL已使用384MB

无索引情况下,更新数据后归增量增加了554MB,表大小无变化,ROLL增加了301MB;

DELETE

操作顺序:删除索引->清理归档->删除数据
image10.pngimage11.pngimage12.pngimage13.pngimage14.png
删除数据用时2min 42s

删除索引、清理归档后,归档总量0MB,表大小174MB,ROLL已使用78MB

删除后归档总量4969MB,表大小1MB,ROLL已使用303MB

无索引情况下,删除数据后归增量增加了4969MB,表大小最终变到1MB,ROLL增加了225MB;

4.1.2 有索引情况

INSERT

操作顺序:创建表->创建索引->写入数据

总插入行数: 5000000

image15.pngimage16.png
image17.png

总耗时: 404秒

初始归档总量0MB,表大小3MB,ROLL已使用83MB

写入数据后,归档总量6108MB,表大小542MB,ROLL已使用83MB

有索引情况下,写入数据后归增量增加了6108MB,表大小增加539MB,ROLL无变化;

UPDATE

操作顺序:清理归档->确认有索引->更新数据
image18.pngimage19.png

image20.png
image21.png

用时2min11 s

更新后归档总量5287MB,表大小775MB,ROLL已使用384MB

有索引情况下,更新数据后归增量增加了5287MB,表大小增加233MB,ROLL增加301MB;

DELETE

操作顺序:清理归档->确认有索引->删除数据
image22.pngimage23.pngimage24.pngimage25.pngimage26.pngimage27.png
image28.png
image29.png

Deleete操作用时23mins51s

删除前归档总量0MB,表大小775MB,ROLL已使用384MB

删除后归档总量16409MB,表大小3MB,ROLL已使用456MB

有索引情况下,删除数据后归增量增加了16409MB,表大小减少至3MB,ROLL增加72MB;

4.2 堆表

4.2.1 无索引情况

INSERT

操作顺序:创建表->写入数据->创建索引

总插入行数: 500万
image30.png
image31.png
image32.png
image33.png
image34.png
image35.png

总耗时: 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。
UPDATE

操作顺序:删除索引->清理归档->更新数据
image36.png
image37.png

更新数据
image38.png
image39.png

用时31s

删除索引、清理归档后,归档总量0MB,表大小315MB,ROLL已使用83MB

更新后归档总量554MB,表大小315MB,ROLL已使用384MB

无索引情况下,更新数据后归增量增加了554MB,表大小不变,ROLL增加301MB;

DELETE

操作顺序:删除索引->清理归档->删除数据
image40.png
image41.png

删除数据
image42.png
image43.png
image44.png
image45.png
image46.png

用时2min42s

删除索引、清理归档后,归档总量0MB,表大小315MB,ROLL已使用384MB

删除后归档总量614MB,表大小315MB,ROLL已使用605MB

无索引情况下,删除数据后归增量增加了614MB,表大小没变化,ROLL增加221MB;。

4.2.2 有索引情况

INSERT

操作顺序:创建表->创建索引->写入数据

总插入行数: 5000000
image47.png
image48.png
image49.png
image50.png

总耗时:758s

初始归档总量0MB,表大小11MB,ROLL已使用83MB

写入数据后,归档总量10576MB,表大小756MB,ROLL已使用83MB

有索引情况下,写入数据后归增量增加了10576MB,表大小增加745MB,ROLL无变化;

UPDATE

操作顺序:清理归档->确认有索引->更新数据
image51.png
image52.png
image53.png
image54.png

用时3min4 s

初始归档总量0MB,表大小756MB,ROLL已使用83MB

更新后归档总量5308MB,表大小996MB,ROLL已使用384MB

有索引情况下,更新数据后归增量增加了5308MB,表大小增加240MB,ROLL大小增加301MB;

DELETE

操作顺序:清理归档->确认有索引->删除数据

清理归档后,归档总量0MB,表大小996MB,ROLL已使用384MB
image55.png
image56.png
image57.png
image58.png
image59.png
image60.png
image61.png
image62.png

====
image63.png
image64.png

用时25min56s

初始归档总量0MB,表大小996MB,ROLL已使用384MB

删除后归档总量11022MB,表大小800MB,ROLL已使用405MB

有索引情况下,删除数据后归增量增加了11022MB,表大小减少196MB,ROLL增加21MB

4.3 ORACLE11g

4.3.1 无索引情况

INSERT

操作顺序:创建表->写入数据->创建索引
总插入行数: 500万
image65.png
image66.png
image67.png
image68.png
image69.png

总耗时: 42秒

写入数据后,归档总量108MB,表大小52MB,ROLL已使用130MB

创建索引后,归档总量294MB,表大小52MB,ROLL已使用130MB

无索引情况下,写入数据后归增量增加了108MB,表大小增加52MB,ROLL增加8MB;
创建索引后,归档量增加了186MB,表大小没变,ROLL无变化;
合计写入数据、创建索引归档量共增加了294MB,表大小增加52MB,ROLL增加8MB
UPDATE

操作顺序:删除索引->清理归档->更新数据
image70.png

更新数据
image71.png
image72.png

用时2min6s

删除索引、清理归档后,归档总量0MB,表大小52MB,ROLL已使用130MB

更新后归档总量1564MB,表大小52MB,ROLL已使用728MB

无索引情况下,更新数据后归增量增加了1564MB,表大小不变,ROLL增加598MB;

DELETE

操作顺序:删除索引->清理归档->删除数据
image73.png
删除数据
image74.png
image75.png

用时7min38s

删除索引、清理归档后,归档总量0MB,表大小52MB,ROLL已使用728MB

删除后归档总量1274MB,表大小0MB,ROLL已使用622MB

无索引情况下,删除数据后归增量增加了1274MB,表大小减少至0MB,ROLL减少106MB;

4.3.2 有索引情况

INSERT

操作顺序:创建表->创建索引->写入数据

总插入行数: 500万
image76.png
image77.png
image78.png
image79.png

总耗时:206秒

初始归档总量0MB,表大小0MB,ROLL已使用623MB

写入数据后,归档总量3108MB,表大小52MB,ROLL已使用1519MB

有索引情况下,写入数据后归增量增加了3108MB,表大小增加52MB,ROLL增加896MB;

UPDATE

操作顺序:清理归档->确认有索引->更新数据

image80.png
image81.png
image82.png

用时2min40s

清理归档后,归档总量0MB,表大小52MB,ROLL已使用1519MB

更新后归档总量3741MB,表大小52MB,ROLL已使用3143MB

有索引情况下,更新数据后归增量增加了3741MB,表大小不变,ROLL增加1624MB;

DELETE

操作顺序:清理归档->确认有索引->删除数据
image83.png
image84.png
image85.png

用时11min32s

清理归档后,归档总量0MB,表大小52MB,ROLL已使用3143MB

删除后归档总量3922MB,表大小0MB,ROLL已使用3252MB

有索引情况下,删除数据后归增量增加了3922MB,表大小减少至0MB,ROLL增加109MB;

5 测试总结

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

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服