为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:银河麒麟
【CPU】: amd R7 5800H
【问题描述】*: 表空间的空间分配情况、还有表的segment分配情况、簇的分配情况,查询数据不对应,因此疑惑。
查看表空间语句:
SELECT
F.TABLESPACE_NAME AS "表空间名称" ,
ROUND((T.TOTAL_SPACE - F.FREE_SPACE) / 1024, 2)AS "已使用" ,
ROUND(F.FREE_SPACE / 1024, 2) AS "未使用" ,
ROUND(T.TOTAL_SPACE / 1024, 2) AS "已分配" ,
CASE WHEN T.TOTAL_SPACE == 0 THEN '' ELSE
(ROUND((F.FREE_SPACE / T.TOTAL_SPACE), 4)* 100) || '% ' END "空闲率",
CASE WHEN T.TOTAL_SPACE == 0 THEN '' ELSE
(ROUND((T.TOTAL_SPACE - F.FREE_SPACE) / T.TOTAL_SPACE, 4) * 100)||'%' END "使用率"
FROM
(
SELECT
TABLESPACE_NAME,
ROUND(SUM(BLOCKS *
(
SELECT PARA_VALUE / 1024 FROM V$DM_INI WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE'
)
/ 1024)) FREE_SPACE
FROM
DBA_FREE_SPACE
GROUP BY
TABLESPACE_NAME
)
F,
(
SELECT
TABLESPACE_NAME,
ROUND(SUM(BYTES / 1048576)) TOTAL_SPACE
FROM
DBA_DATA_FILES
GROUP BY
TABLESPACE_NAME
)
T,
(
SELECT
TABLESPACE_NAME,
ROUND(SUM(MAXBYTES / 1048576)) TOTAL_MAX_SPACE
FROM
DBA_DATA_FILES
GROUP BY
TABLESPACE_NAME
)
H
WHERE
F.TABLESPACE_NAME = T.TABLESPACE_NAME
AND F.TABLESPACE_NAME =H.TABLESPACE_NAME;
结果:
行号 表空间名称 已使用 未使用 已分配 空闲率 使用率
1 MAIN 0 0.12 0.13 98.44% 1.56%
2 tb_test 3.07 0.04 3.11 1.19% 98.81%
3 tb_test2 0 0.1 0.1 100% 0%
4 SYSTEM 0.02 0.05 0.07 72.97% 27.03%
5 ROLL 0.03 0.09 0.13 73.44% 26.56%
6 TEMP 0 1 1 99.9% 0.1%
6 rows got
其中tb_test使用3G空间。
查看segment语句:
SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,EXTENTS,BLOCKS,BYTES/1024/1024 from user_segments;
行号 SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENTS BLOCKS BYTES/1024/1024
1 ind1 INDEX tb_test 10741 171856 1342
2 tmov TABLE tb_test 14197 227152 1774
已用时间: 15.464(毫秒). 执行号:1202.
SQL>
查看tmov和索引占用空间为1.7G和1.3G
查看extents语句:
SQL> select OWNER,SEGMENT_NAME,TABLESPACE_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS,BYTES/1024 from dba_extents where segment_name='TMOV';
行号 OWNER SEGMENT_NAME TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS BYTES/1024
1 YCQ tmov tb_test 1 0 16 16 128
2 YCQ tmov tb_test 266 0 4256 16 128
3 YCQ tmov tb_test 541 0 8656 16 128
4 YCQ tmov tb_test 870 0 13920 16 128
5 YCQ tmov tb_test 1525 0 24400 16 128
6 YCQ tmov tb_test 2174 0 34784 16 128
7 YCQ tmov tb_test 2814 0 45024 16 128
8 YCQ tmov tb_test 3975 0 63600 16 128
9 YCQ tmov tb_test 4636 0 74176 16 128
10 YCQ tmov tb_test 5294 0 84704 16 128
11 YCQ tmov tb_test 6453 0 103248 16 128
12 YCQ tmov tb_test 7086 0 113376 16 128
13 YCQ tmov tb_test 7744 0 123904 16 128
14 YCQ tmov tb_test 8403 0 134448 16 128
15 YCQ tmov tb_test 1204 1 19264 16 128
16 YCQ tmov tb_test 1818 1 29088 16 128
17 YCQ tmov tb_test 2982 1 47712 16 128
18 YCQ tmov tb_test 3643 1 58288 16 128
19 YCQ tmov tb_test 4307 1 68912 16 128
20 YCQ tmov tb_test 5441 1 87056 16 128
21 YCQ tmov tb_test 6099 1 97584 16 128
22 YCQ tmov tb_test 6757 1 108112 16 128
23 YCQ tmov tb_test 7406 1 118496 16 128
24 YCQ tmov tb_test 1988 2 31808 16 128
25 YCQ tmov tb_test 2651 2 42416 16 128
26 YCQ tmov tb_test 3306 2 52896 16 128
27 YCQ tmov tb_test 4453 2 71248 16 128
28 YCQ tmov tb_test 5111 2 81776 16 128
29 YCQ tmov tb_test 5770 2 92320 16 128
30 YCQ tmov tb_test 7562 2 120992 16 128
31 YCQ tmov tb_test 8116 2 129856 2 16
31 rows got
已用时间: 18.385(毫秒). 执行号:1203.
查看簇的分配情况,每个extent才128K,一共才31个簇,如何对应1.7G空间。
其中dba_extents的作用,还有如何查看簇的分布情况。
当有多个数据文件时,簇是否均衡的分布在数据文件上?
SELECT TABLE_USED_SPACE('YCQ', 'tmov')*PAGE/1024.0/1024 MB FROM DUAL;
select ts_id,file_id,seg_id,count(*) from v$extents group by ts_id,file_id,seg_id order by 4 desc limit 100;
SQL> select table_used_space(user,'MYOBJ')*page/1024.0/1024 MB from dual;
LINEID MB
---------- --------
1 7176.375
SQL> select page from dual;
LINEID PAGE
---------- -----------
1 8192
SQL> select * from v$parameter where name = 'GLOBAL_EXTENT_SIZE';
LINEID ID NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION DEFAULT_VALUE ISDEFAULT
---------- ----------- ------------------ --------- ----- --------- ---------- ------------------ ------------- -----------
1 639 GLOBAL_EXTENT_SIZE READ ONLY 16 16 16 global_extent_size 16 1
-- 表有2个子对象,IOT表和1个二级索引
SQL> select id,name,type$,subtype$ from sysobjects where pid = ( select id from sysobjects where subtype$='UTAB' and name='MYOBJ' );
LINEID ID NAME TYPE$ SUBTYPE$
---------- ----------- ------------------- ------ --------
1 33555464 INDEX33555464 TABOBJ INDEX
2 33555465 IDX_OWNER_OBJECT_ID TABOBJ INDEX
-- 上边2个本质上都是索引,有叶子段和分支段,所以有4个段信息
SQL> select * from v$segment_infos where obj_id in (33555464,33555465);
LINEID TS_ID SEG_ID TYPE OBJ_ID INODE_FILE_ID INODE_PAGE_NO INODE_OFFSET N_FULL_EXTENT N_FREE_EXTENT N_FRAG_EXTENT N_FRAG_PAGE
---------- ----------- ----------- --------- ----------- ------------- ------------- ------------ ------------- ------------- ------------- -----------
1 4 2297 LEAF_SEG 33555464 0 8 124 43263 0 1 8
2 4 2296 INNER_SEG 33555464 0 8 52 98 0 0 0
3 4 2299 LEAF_SEG 33555465 0 8 268 13851 0 112 775
4 4 2298 INNER_SEG 33555465 0 8 196 53 0 33 265
-- 段分布,我的表表空间是默认的=4只有一个数据文件=0
SQL> select ts_id,file_id,seg_id,count(*) from v$extents where seg_id in (2297,2296,2299,2298) group by ts_id,file_id,seg_id;
LINEID TS_ID FILE_ID SEG_ID COUNT(*)
---------- ----------- ----------- ----------- --------------------
1 4 0 2297 43264
2 4 0 2299 13963
3 4 0 2298 86
4 4 0 2296 98
SQL> select (43264+98)*16*8/1024.0 tab_MB, (13963+86)*16*8/1024.0 idx_MB from dual;
LINEID TAB_MB IDX_MB
---------- ------- --------
1 5420.25 1756.125
SQL> select 5420.25 + 1756.125 total_MB from dual;
LINEID TOTAL_MB
---------- --------
1 7176.375
个人实验推测,dba_extents并没有把每一个extent都记录在内,而是记录了每一个连续簇中第一个extend的id(考虑到表规模、维护性等),因此这里查的31只是一共有31段连续的簇。实际的簇数量是:

14197*128K/1024=1774M大小
验证过程:


建表t1,插入若干数据,然后建表t2:
查询user_segments,得到t1占用29个extent:
查询dba_extents,只查询到了一个t1的簇:
同时注意到,t2的簇id-t1的簇id刚好等于t1一共占用的簇(因为t2紧跟着t1建的,因此id自然是紧随其后),由此得证。
当然,下次插入t1的时候,因为已经不跟原来的extent_id连续了,因此dba_extents会新开一条记录