SQL> create table TEST( A CHAR(1024));
-- 第二步:查看段存储信息(对象是以段为分配单位)
SQL> select * from user_extents where segment_name = 'TEST';
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS
------------ ---------------- - ----------- --------------- ---------- - --------- ----------
TEST TABLE P_HDTEST 0 65536 8
-- 第三步:表创建的时候会按照初始化参数进行创建,默认是Initial extent为64k,包含8个数据块。
SQL> select bytes,blocks,initial_extent,next_extent,min_extents,max_extents from user_segments where segment_name = 'TEST';
BYTES BLOCKS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS
------ ---------- -------------- ----------- ----------- -----------
65536 8 65536 1 2147483645
-- 第四步:插入1000条原始记录,1000*1k约等于1M
declare
-- Local variables here
i integer;
begin
-- Test statements here
for i in 1..1000
loop
INSERT INTO TEST VALUES(I);
end loop;
COMMIT;
end;
-- 第五步:查看段现在的存储信息。
select SUM(BYTES) from user_extents where segment_name='TEST'
select * from dba_extents where segment_name='TEST'
SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
-------- ------------------ ------------------------------ ---------- ---------- ---------- ---------- ---------- -------
TABLE TP_HDTEST 0 7 835217 65536 8 7
TABLE TP_HDTEST 1 7 835225 65536 8 7
TABLE TP_HDTEST 2 7 835233 65536 8 7
TABLE TP_HDTEST 3 7 835241 65536 8 7
TABLE TP_HDTEST 4 7 835249 65536 8 7
TABLE TP_HDTEST 5 7 835257 65536 8 7
TABLE TP_HDTEST 6 7 835265 65536 8 7
TABLE TP_HDTEST 7 7 835273 65536 8 7
TABLE TP_HDTEST 8 7 835281 65536 8 7
TABLE TP_HDTEST 9 7 835289 65536 8 7
TABLE TP_HDTEST 10 7 835297 65536 8 7
SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
-------- ------------------ ------------------------------ ---------- ---------- ---------- ---------- ---------- -------
TABLE TP_HDTEST 11 7 835305 65536 8 7
TABLE TP_HDTEST 12 7 835313 65536 8 7
TABLE TP_HDTEST 13 7 835321 65536 8 7
TABLE TP_HDTEST 14 7 835329 65536 8 7
TABLE TP_HDTEST 15 8 891017 65536 8 8
TABLE TP_HDTEST 16 9 891273 1048576 128 9
-- 第六步:执行delete操作
Delete * from test;
执行后再次查询存储信息,没有发生任何变化。
SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
-------- ------------------ ------------------------------ ---------- ---------- ---------- ---------- ---------- -------
TABLE TP_HDTEST 0 7 835217 65536 8 7
TABLE TP_HDTEST 1 7 835225 65536 8 7
TABLE TP_HDTEST 2 7 835233 65536 8 7
TABLE TP_HDTEST 3 7 835241 65536 8 7
TABLE TP_HDTEST 4 7 835249 65536 8 7
TABLE TP_HDTEST 5 7 835257 65536 8 7
TABLE TP_HDTEST 6 7 835265 65536 8 7
TABLE TP_HDTEST 7 7 835273 65536 8 7
TABLE TP_HDTEST 8 7 835281 65536 8 7
TABLE TP_HDTEST 9 7 835289 65536 8 7
TABLE TP_HDTEST 10 7 835297 65536 8 7
SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
-------- ------------------ ------------------------------ ---------- ---------- ---------- ---------- ---------- -------
TABLE TP_HDTEST 11 7 835305 65536 8 7
TABLE TP_HDTEST 12 7 835313 65536 8 7
TABLE TP_HDTEST 13 7 835321 65536 8 7
TABLE TP_HDTEST 14 7 835329 65536 8 7
TABLE TP_HDTEST 15 8 891017 65536 8 8
TABLE TP_HDTEST 16 9 891273 1048576 128 9
SQL> TRUNCATE TABLE TEST;
表被截断。
SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BYTES BLOCKS
-------- ------------------ ------------------------------ ---------- ---------- ----------
TABLE TP_HDTEST 0 65536 8
结论:
数据被删除后,高水平线(high-water mark,HWM)并没有复位只是那些空间不再使用而已,再次查询依然会读取HWH以前的块查找是否有可用的数据。而截断表将复位HWH,告诉这些空间没有保存数据。
其他引申出来的问题:
在插入测试的数据过程中,如果首先插入100条、200条的时候,数据库分配区间是以64k为单位分配的,当插入到1000条时,新分配的区间突然变为1M。
通过google找到的介绍:
先分配16个64K的extent,
0-15 extents每个大小是64K合计大小1M
16-79 extents每个大小是1M合计大小63M --以上两项大小合计64M
80-199 extents每个大小是8M合计大小960M --以上三项大小合计1024M=1G
200-??extents每个大小是64M
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7204674/viewspace-591638/ ,如需转载,请注明出处,否则将追究法律责任。