ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 表空间和数据文件实验三:高水位HWM内部分析

表空间和数据文件实验三:高水位HWM内部分析

原创 Linux操作系统 作者:dawningwang 时间:2011-01-07 16:10:55 0 删除 编辑

表空间和数据文件实验三  高水位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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-05-15

  • 博文量
    18
  • 访问量
    26437