为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:
一个表空间对应多个DATAFILE和一个HUGEDIR:
create tablespace ts_test5 datafile 'test501.dbf' size 128, 'test502.dbf' size 128 autoextend on next 1 maxsize 1024 WITH HUGE PATH 'test501huge';
多个datafile的作用是什么,我应该使用一个表空间多个DATAFILE,还是
多个(一个表空间一个DATAFILE),性能有什么区别,这么设计的原因是什么呢?
刚简单测试了下,当一个表空间对应多个数据文件时,向该表空间的表中写入的数据会分布到各个数据文件中,感觉有点像条带化,不过应该有数据簇/页写入的规则或算法,不是简单的逐文件循环写。
这样直观的优点是可以对多个数据文件进行并行读写,如果数据文件分布在不同的存储设备/磁盘上,能够提升并行写入的性能。
当然,这只是我个人根据测试结果的主观感受和臆测,具体情况还望达梦是技术人员能给出官方说明(目前官方文档里没找到这方面的详细内容)。
我的测试过程如下:
-- 创建一个有三个数据文件的表空间
CREATE TABLESPACE TS_3FILE
DATAFILE 'D:\TS_3FILE_01.DBF' SIZE 128
,'D:\TS_3FILE_02.DBF' SIZE 128
,'D:\TS_3FILE_03.DBF' SIZE 128;
-- 创建测试表,存储于新建表空间里
CREATE TABLE T_TEST_TS3(A INT,B INT)
STORAGE (ON TS_3FILE)
;
-- 插入100k测试记录
INSERT INTO T_TEST_TS3
SELECT A.LVL,B.LVL
FROM (SELECT LEVEL AS LVL CONNECT BY LEVEL <= 100) A
,(SELECT LEVEL AS LVL CONNECT BY LEVEL <= 1000) B
;
COMMIT;
-- 查看该表空间的使用情况
SELECT TS.NAME AS TABLESPACE_NAME
,DF.PATH
,DF.TOTAL_SIZE
,DF.FREE_SIZE
,DF.PAGES_READ
,DF.PAGES_WRITE
FROM V$TABLESPACE TS
,V$DATAFILE DF
WHERE TS.ID = DF.GROUP_ID
AND TS.NAME = 'TS_3FILE';
-- 从查询结果里能看出该表空间三个数据文件都有写入操作
TABLESPACE_NAME PATH TOTAL_SIZE FREE_SIZE PAGES_READ PAGES_WRITE
TS_3FILE D:\TS_3FILE_01.DBF 16384 16224 0 155
TS_3FILE D:\TS_3FILE_02.DBF 16384 16224 0 147
TS_3FILE D:\TS_3FILE_03.DBF 16384 16240 0 130
-- 查看该表的数据段信息,以便后面根据数据段查看数据分布情况
SELECT TAB.NAME AS TABLE_NAME
,SEG.TYPE AS SEGMENT_TYPE
,IDXINFO.ID AS CLUSTER_INDEX_ID
,SEG.TS_ID AS GROUP_ID
,SEG.SEG_ID AS SEGMENT_ID
,(SELECT LISTAGG('File'||FILE_ID||': '||PAGECNT||' Pages','; ') WITHIN GROUP (ORDER BY FILE_ID)
FROM (SELECT FILE_ID,COUNT(1) AS PAGECNT
FROM V$SEGMENT_PAGES XX
WHERE XX.GROUP_ID = SEG.TS_ID
AND XX.SEG_ID = SEG.SEG_ID
GROUP BY FILE_ID
)
) AS PAGE_STAT
FROM SYSOBJECTS TAB
,SYSOBJECTS IDX
,SYSINDEXES IDXINFO
,V$SEGMENT_INFOS SEG
WHERE IDX.PID = TAB.ID
AND IDXINFO.ID = IDX.ID
AND BITAND(IDXINFO.XTYPE,0x01) = 0x00
AND SEG.TS_ID = IDXINFO.GROUPID
AND SEG.OBJ_ID = IDXINFO.ID
AND TAB.NAME = 'T_TEST_TS3'
;
-- 从查询结果能看到三个数据文件都有页面占用,但占用页面数有区别。
-- LEAF_SEG 数据叶子节点段; INNER_SEG 数据内节点段
TABLE_NAME SEGMENT_TYPE CLUSTER_INDEX_ID GROUP_ID SEGMENT_ID PAGE_STAT
T_TEST_TS3 LEAF_SEG 33745583 24 387221 File0: 128 Pages; File1: 141 Pages; File2: 128 Pages
T_TEST_TS3 INNER_SEG 33745583 24 387220 File0: 2 Pages
-- 下面这个SQL能查询指定数据段在不同数据文件中具体数据页记录
SELECT *
FROM V$SEGMENT_PAGES
WHERE GROUP_ID = 24
AND SEG_ID = 387221
;
这里是使用本身就有区别,因为建表的时候只能建在一个表空间上,所以建多个表空间这张表也只能使用一个(分区表除外)。建议的就是普通的表使用一个表空间使用多个数据文件。(如果是分区表的话,分区可以落在不同表空间上,然后不同表空间使用不同磁盘来打散IO)
多个datafile是第一个数据文件空间满之后,会自动使用下一个数据文件,属于一个表空间多个数据文件,同时也可以一个表空间一个数据文件,在空间满后进行扩展数据文件大小或添加另一个数据文件,可参考该链接操作:https://eco.dameng.com/community/post/20231121161751KNF9K2B9GO42OW399H