请教一个表占用物理空间的问题

[复制链接]
查看11 | 回复9 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
一张名为T_TEST的表中有记录75个,
使用sql:
select T.segment_name,t.bytes/1024/1024total_sizefrom user_segments t where t.segment_name ='T_TEST'
SEGMENT_NAME
TOTAL_SIZE
-------------------------------------------------------------------------------- ----------
TACCTWATER
1534
查找到total_size大小为1.5G,使用truncate后占用大小不变
使用脚本查看高水位:
SQL> DECLARE
2ownerVARCHAR2(30);
3NAME VARCHAR2(30);
4seg_type VARCHAR2(30);
5tblock NUMBER;
6tbyteNUMBER;
7ublock NUMBER;
8ubyteNUMBER;
9lue_fidNUMBER;
10lue_bidNUMBER;
11lublockNUMBER;
12
13BEGIN
14
15dbms_space.unused_space(upper('mocs2'), upper('T_TEST'), 'TABLE', tblock, tbyte, ublock, ubyte, lue_fid, lue_bid, lublock);
16dbms_output.put_line('Total blocks allocated to table = '|| to_char(tblock));
17dbms_output.put_line('Total bytes allocated to table = '|| to_char(tbyte));
18dbms_output.put_line('Unused blocks(above HWM) = '|| to_char(ublock));
19dbms_output.put_line('Unused bytes(above HWM)= '|| to_char(ubyte));
20dbms_output.put_line('Last extent used file id = '|| to_char(lue_fid));
21dbms_output.put_line('Last extent used beginning block id = '|| to_char(lue_bid));
22dbms_output.put_line('Last used block in last extent = '|| to_char(lublock));
23END;
24/
Total blocks allocated to table = 128
Total bytes allocated to table = 1048576
Unused blocks(above HWM) = 126
Unused bytes(above HWM)= 1032192
Last extent used file id = 116
Last extent used beginning block id = 2569
Last used block in last extent = 2
可见高水位并不高(为1),所以使用truncate不会移回HWM,但是不明白空间为什么会占用1.5G?

查询分配的块数:
SQL> select sum(blocks) "Total Blocks",sum(bytes) "Total Size" from user_extents
2wheresegment_name='T_TEST';
Total Blocks Total Size
------------ ----------
1281048576


当move表后:
查看高水位:
SQL> DECLARE
2ownerVARCHAR2(30);
3NAME VARCHAR2(30);
4seg_type VARCHAR2(30);
5tblock NUMBER;
6tbyteNUMBER;
7ublock NUMBER;
8ubyteNUMBER;
9lue_fidNUMBER;
10lue_bidNUMBER;
11lublockNUMBER;
12
13BEGIN
14
15dbms_space.unused_space(upper('mocs2'), upper('T_TEST'), 'TABLE', tblock, tbyte, ublock, ubyte, lue_fid, lue_bid, lublock);
16dbms_output.put_line('Total blocks allocated to table = '|| to_char(tblock));
17dbms_output.put_line('Total bytes allocated to table = '|| to_char(tbyte));
18dbms_output.put_line('Unused blocks(above HWM) = '|| to_char(ublock));
19dbms_output.put_line('Unused bytes(above HWM)= '|| to_char(ubyte));
20dbms_output.put_line('Last extent used file id = '|| to_char(lue_fid));
21dbms_output.put_line('Last extent used beginning block id = '|| to_char(lue_bid));
22dbms_output.put_line('Last used block in last extent = '|| to_char(lublock));
23END;
24/
Total blocks allocated to table = 128
Total bytes allocated to table = 1048576
Unused blocks(above HWM) = 126
Unused bytes(above HWM)= 1032192
Last extent used file id = 125
Last extent used beginning block id = 3977
Last used block in last extent = 2
PL/SQL procedure successfully completed
可见高水位的位置没有变化

再查询表空间占用大小
SQL> select T.segment_name,t.bytes/1024/1024 from user_segments t where t.segment_name ='T_TEST';
SEGMENT_NAME
T.BYTES/1024/1024
-------------------------------------------------------------------------------- -----------------
T_TEST
1
表占用的物理空间已经由1.5G 降低到1M
查询分配的块数:
SQL> select sum(blocks) "Total Blocks",sum(bytes) "Total Size" from user_extents
2wheresegment_name='T_TEST';
Total Blocks Total Size
------------ ----------
1281048576

请问为什么么move后,表占用的空间已经由1.5G缩减到1M?这个问题应该是和高水位没有关系吧 ?
(另外user_extents里的bytes和user_segments里的bytes有什么区别? ) 谢谢
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
第一次查询的时候已经变回1M了啊?你1.5G的查询结果可否贴出来?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 teddyboy 发布
[B]第一次查询的时候已经变回1M了啊?你1.5G的查询结果可否贴出来? [/B]

在move前使用下面的sql查询:
select T.segment_name,t.bytes/1024/1024 total_size from user_segments t where t.segment_name ='T_TEST'
得到的结果就是
segment_name Total Size
------------ ----------
'T_TEST'
1.5G (近似值)

上面的结果是我手写,我重新在数据库执行了脚本
select T.segment_name,t.bytes/1024/1024 total_size from user_segments t where t.segment_name ='T_TEST'
SEGMENT_NAME
TOTAL_SIZE
-------------------------------------------------------------------------------- ----------
TACCTWATER
1534
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
1.5G?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
很怀疑你的查询结果,还没有碰到过你这种情况,如果可以你drop掉重建好了
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
第一个查询的结果有问题。因为紧接着查看高水位的脚本的结果分明显示只是占了1M
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
truncate肯定释放HWM的
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
bytes/1024/1024 total_size =1.5G ???
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
好像是自己写出来的
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
在MOVE前你有这个查询语句
查询分配的块数:
SQL> select sum(blocks) "Total Blocks",sum(bytes) "Total Size" from user_extents
2 where segment_name='T_TEST';
Total Blocks Total Size
------------ ----------
128 1048576
这个分明就已经说明只有1M了呀.为什么说还有1.5GB呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行