表空间和数据文件实验三 高水位HWM及降低HWM方法扩展实验
HWM实验中其实有深刻的变化,通过下面实验发现:
SQL> create table scott.test2 as select * from dba_objects;
表已创建。
SQL> select extent_id,file_Id,block_id from dba_extents where segment_name='TEST2';
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
0 4 601
1 4 609
2 4 625
3 4 633
4 4 641
5 4 649
6 4 657
7 4 665
8 4 673
9 4 681
10 4 689
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
11 4 697
12 4 705
13 4 713
14 4 721
15 4 729
16 4 777
17 4 905
18 4 1033
19 4 1161
20 4 1289
已选择21行。
发现创建这个表时用了21个区间。
SQL> alter system dump datafile 4 block min 601 block max 640;
系统已更改。
记录前40个块的信息,对重要的区间进行跟踪分析。
SQL> set autotrace on;
SQL> select count(*) from scott.test2;
COUNT(*)
----------
50740
统计信息
----------------------------------------------------------
28 recursive calls
0 db block gets
771 consistent gets
697 physical reads
0 redo size
SQL> set autotrace off;
SQL> delete from scott.test2 where rownum <30001;
已删除30000行。
SQL> select extent_id,file_Id,block_id from dba_extents where segment_name='TEST2';
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
0 4 601
1 4 609
2 4 625
3 4 633
4 4 641
5 4 649
6 4 657
7 4 665
8 4 673
9 4 681
10 4 689
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
11 4 697
12 4 705
13 4 713
14 4 721
15 4 729
16 4 777
17 4 905
18 4 1033
19 4 1161
20 4 1289
已选择21行。
删除这么多数据,可仍然占用21个区间。跟踪:
SQL> alter system dump datafile 4 block min 601 block max 640;
系统已更改。
SQL> set autotrace on;
SQL> select count(*) from scott.test2;
COUNT(*)
----------
20740
统计信息
----------------------------------------------------------
650 recursive calls
0 db block gets
864 consistent gets
1 physical reads
0 redo size
SQL> set autotrace off;
SQL> alter table scott.test2 enable row movement;
表已更改。
SQL> alter table scott.test2 shrink space;
表已更改。
SQL> select extent_id,file_Id,block_id from dba_extents where segment_name='TEST2';
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
0 4 601
1 4 609
2 4 625
3 4 633
4 4 641
5 4 649
6 4 657
7 4 665
8 4 673
9 4 681
10 4 689
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
11 4 697
12 4 705
13 4 713
14 4 721
15 4 729
16 4 777
17 4 905
已选择18行。
Shrink后,占的空间由21个减少到18个。跟踪:
SQL> alter system dump datafile 4 block min 601 block max 640;
系统已更改。
SQL> set autotrace on;
SQL> select count(*) from scott.test2;
COUNT(*)
----------
20740
统计信息
----------------------------------------------------------
202 recursive calls
0 db block gets
358 consistent gets
15 physical reads
0 redo size
SQL> commit;
提交完成。
Commit后,全表扫描更少:
SQL> select count(*) from scott.test2;
COUNT(*)
----------
20740
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
263 consistent gets
0 physical reads
0 redo size
SQL> alter table scott.test2 shrink space;
表已更改。
SQL> commit;
提交完成。
SQL> select count(*) from scott.test2;
COUNT(*)
----------
20740
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
263 consistent gets
0 physical reads
0 redo size
这里用两个表做个统计:
表1:删除数据前后扫描的变化
|
记录数 |
动作 |
consistent gets |
|
50740 |
执行count |
771 |
|
20740 |
50740条数据删除30000条数据后,执行count |
864 |
|
20740 |
执行shrink, 执行count |
263 |
表2:高水位变化和块的变化:依据跟踪信息
|
记录数 |
块中的变化 |
高水位HWM的变化 |
区间数 |
|
50740 |
0:Metadata 1:Metadata 2:Metadata 3:FULL 4:FULL 5:FULL 6:FULL 7:FULL 8:FULL 9:FULL 10:FULL 11:FULL 12:FULL 13:FULL 14:FULL 15:FULL |
Highwater:: 0x01000556 Low HighWater Mark : Highwater:: 0x01000556 Level 1 BMB for High HWM block: 0x0100050a Level 1 BMB for Low HWM block: 0x0100050a |
21 |
|
20740(删除后) |
0:Metadata 1:Metadata 2:Metadata 3:75-100% free 4:75-100% free 5:75-100% free 6:75-100% free 7:75-100% free 8:75-100% free 9:75-100% free 10:75-100% free 11:75-100% free 12:75-100% free 13:75-100% free 14:75-100% free 15:75-100% free |
Highwater:: 0x01000556 Low HighWater Mark : Highwater:: 0x01000556 Level 1 BMB for High HWM block: 0x0100050a Level 1 BMB for Low HWM block: 0x0100050a |
21 |
|
20740(shrink后) |
0:Metadata 1:Metadata 2:Metadata 3:FULL 4:FULL 5:FULL 6:FULL 7:FULL 8:FULL 9:FULL 10:FULL 11:FULL 12:FULL 13:FULL 14:FULL 15:FULL |
Highwater:: 0x0100039a Low HighWater Mark : Highwater:: 0x0100039a Level 1 BMB for High HWM block: 0x01000389 Level 1 BMB for Low HWM block: 0x01000389
|
18 |
从上表中可以看出,块中数据状态因开始时是满的,是FULL,到删除数据后状态变为75-100% free ,再到shrink后又变为FULL;而高水位HWM的变化并没有因删除数据而变化,可以看到高水位值没有变化,可shrink后高水位却变化了。这些动作的背后其实是执行了一系列的DML操作,因为删除操作,所以使得块的状态由FULL变为75-100% free,即这些块还可以被重用,但HWM不变。Shrink后执行的DML操作就是把后面的数据填到前面不用的空间中,使得数据紧凑,这样可以节约空间,也可以省去扫描时间。HWM在创建的段中出现在本段的第3个块中。
问:反复shrink会不会让全面扫描更少呢?windows中反复磁盘碎片整理可以让碎片数目更少的。
以前在HWM下面,现在shrink后在HWM上面的块算是使用过的,还是unformatted的?
由21个区间变为18个,那3个区间怎么变化的:
SQL> alter system dump datafile 4 block min 1033 block max 1035;
系统已更改。
SQL> alter system dump datafile 4 block min 1161 block max 1164;
系统已更改。
SQL> alter system dump datafile 4 block min 1289 block max 1291;
系统已更改。
SQL> select owner ,segment_name from dba_extents where file_id=4 and block_id=1033;
未选定行
发现这个块是空的。
发现:1033 是 FIRST LEVEL BITMAP BLOCK parent dba: 0x0100025a,即602块。1034是 FIRST LEVEL BITMAP BLOCK parent dba: 0x0100025a,即602块。这两个块共管理128个块,其中前64个归1033管,后64个归1044管。
后面分析的两个区间和这个区间的分析相同。数据部分除了元数据外都显示unformatted。即这个块的段的组织结构还在,但块的数据状态已经成了unformatted,即没有使用的。这个和操作系统unformatted还不一样。
后来又经历了相同的实验,对释放了的这3个区间在开始,删除数据后和shrink后的状态进行跟踪,发现开始时数据状态是FULL,删除数据后有FULL,也有75-100% free ,shrink后unformatted。证明这个unformatted是未使用的块,这个块也可能是曾经使用而现在不使用的,而不是简单认为的未格式化的块。这个unformatted与操作系统的未格式化概念有点区别。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22528444/viewspace-683445/ ,如需转载,请注明出处,否则将追究法律责任。