天天看点

测试2——表空间管理 段空间管理 段收缩测试

表空间的管理

 --简要语法:

    CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace name

    DATAFILE datafile spec | TEMPFILE tempfile spec

    [MINIMUM EXTENT minimum extent size]

    [BLOCKSIZE blocksize]

    [[COMPRESS|NOCOMPRESS] DEFAULT STORAGE (default storage clause)]

    [LOGGING|NOLOGGING]

    [FORCE LOGGING]

    [ONLINE|OFFLINE]

    [EXTENT MANAGEMENT DICTIONARY | LOCAL [AUTOALLOCATE|UNIFORM SIZE size]]

    [SEGMENT SPACE MANAGEMENT MANUAL|AUTO]

    [FLASHBACK ON|OFF]

注意标红的部分,EXTENT管理,也就是所谓的表空间管理;而SEGMENT管理就是所谓的段空间管理。我们稍后会做一个段空间收缩的实验。

字典管理:oracle 8i(不包括i),只存在一种表空间的管理模式,即字典管理表空间(DMT),DMT是指oracle的空间分配或回收是通过数据库中的数据字典表来记录和管理的,用于管理的两个数据字典表分别是:UET$(used

extents)和FET$(freeextents) 。其工作方式是:当建立一个新的段或者段在表空间时,oracle通过一系列的SQL语句来完成这个工作; 且和前面的两个字典表有关,在繁忙的系统中会造成竞争和等待(另一个DMT会带来的问题是空间碎片)(DMT已经废弃了)

    本地管理(LMT):   在9i的R2版本后成了默认的选项

       LMT在表空间的数据文件头部加入了一个位图区域,在其中记录每个extent的使用状况

       当extent被使用或者被释放,oracle会更新头部的记录来反映这个变化,不产生回滚信息

        因为仅仅操作数据文件头部的几个数据块,不用操作数据字典,LMT比DMT要快,尤其是在繁忙的时候更明显

在每个表空间的数据文件的头部加入了一个位图区域 

一个段的第一个区的第一个块是first level bitmap block 

第二个块是second level bitmap block 

第三个块才是段头块 

这两个块是用来管理freeblock 

若为自动分配,则Oracle会按照递增算法来分配空间 

如果选择统一尺寸,还可以详细指定每个区间的大小 

dba_extents这个视图可以看到哪些对象分配了多少区间 

段空间管理:

从9i开始,段空间管理有两种: 

①MSSM:由你设置freelists、freelistgroups、pctused、pctfree、initrans等参数来控制如何分配、使用段中的空间 

②ASSM:你只需控制一个参数pctfree,其他参数即使建了也将被忽略 

(1)freelist和freelistgroup

使用MSSM表空间管理时,Oracle会在freelist中为有自由空间的对象维护HWM以下的块 

freelist和freelistgroup在ASSM表空间中根本不存在,仅在MSSM表空间使用这个技术 

(2)pctfree和pctused 

pctfree告诉Oracle:块上应该保留多大的空间来完成将来的更新 

对于MSSM,她控制着块何时放入freelist中,以及何时从freelist中取出。 如果大于pctfree,则这个块会一直在freelist上 

对于ASSM,因为ASSM根本不使用freelist。在ASSM中,pctused也将被忽略。 

但她仍然会限制能否将一个新行插入到一个块中 .

适当的设置pctfree有助于减小行迁移 .

⑶initrans 

无论是ASSM  or  MSSM这个参数仍然有效 

块头的事务槽的初始化大小有对象的initrans指定

实验:shrink命令完成段收缩

从10g开始,oracle开始提供Shrink的命令,假如我们的表空间中支持自动段空间管理 (ASSM),就可以使用这个特性缩小段,即降低HWM.这里需要强调一点,10g的这个新特性,仅对ASSM表空间有效,否则会报ORA-10635:

Invalid segment or tablespace type.

在这里,我们来讨论如和对一个ASSM的segment回收浪费的空间.

同样,我们用系统视图all_objects来在tablespace ASSM上创建测试表my_objects,这一小节的内容,

实验环境为oracle11.2.0.3:

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

CORE 11.2.0.3.0Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 - Production

[oracle@lyg ~]$ sqlplus "/as sysdba"

SQL*Plus: Release 11.2.0.3.0 Production on Thu Apr 10 14:31:45 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:

With the Partitioning, OLAP, Data Mining and Real Application Testing options

创建测试表空间:

SQL>  CREATE  TABLESPACE ASSMTEST

    DATAFILE '/u01/app/oracle/oradata/test/assmtest01.dbf' size 50m  2  ;

Tablespace created.

SQL> create user assmtest identified by assm default tablespace ASSMTEST;

User created.

SQL>  grant connect,resource to assmtest;

Grant succeeded.

创建测试用户:

SQL> grant dba to assmtest;

SQL> conn assmtest/assm

Connected.

SQL> create table my_objects as select * from dba_objects;

Table created.

查看表空间管理状态:

select TABLESPACE_NAME,BLOCK_SIZE,EXTENT_MANAGEMENT,ALLOCATION_TYPE, SEGMENT_SPACE_MANAGEMENT 

from dba_tablespaces where TABLESPACE_NAME = 'ASSMTEST';

测试2——表空间管理 段空间管理 段收缩测试

然后我们随机地从table MY_OBJECTS中删除一部分数据:

SQL>select count(*) from my_objects;

COUNT(*)

----------

74582

SQL>delete from my_objects where object_name like '%C%';

27523 rows deleted.

SQL>delete from my_objects where object_name like '%U%';

6632 rows deleted.

SQL> delete from my_objects where object_name like '%A%';

10828 rows deleted.

现在我们使用show_space和show_space_assm来看看my_objects的数据存储状况:

SQL>exec show_space('MY_OBJECTS','ASSMTEST');

SQL> exec show_space('MY_OBJECTS','ASSMTEST');

Unformatted Blocks  ....................     0

FS1 Blocks (0-25)   ....................       0

FS2 Blocks (25-50)  ....................     330

FS3 Blocks (50-75)  ....................     270

FS4 Blocks (75-100) ....................    398

Full Blocks    ....................

     65

Total Blocks ...........................       1,152

Total Bytes  ...........................              9,437,184

Total MBytes ...........................       9

Unused Blocks...........................      63

Unused Bytes ...........................       516,096

Last Used Ext FileId....................      8

Last Used Ext BlockId..................    1,152

Last Used Block.........................      65

PL/SQL procedure successfully completed.

SQL>exec show_space_assm('MY_OBJECTS','ASSMTEST');

SQL> exec show_space_assm('MY_OBJECTS','ASSMTEST');

free space 0-25% Blocks:................0

free space 25-50% Blocks:...............330

free space 50-75% Blocks:...............270

free space 75-100% Blocks:..............398

Full Blocks:............................65

Unformatted blocks:.....................0

这里,table my_objects的HWM下有1151个block,其中,free space为25-50%的block有330个,free

space为50-75%的block有270个,free space为75-100%的block有398个,full space的block只有65个,这种情况下,我们需要对这个table的现有数据行进行重组.

要使用assm上的shink,首先我们需要使该表支持行移动,可以用这样的命令来完成:

SQL>alter

table my_objects enable row movement;

现在,就可以来降低my_objects的HWM,回收空间了,使用命令:

SQL>   alter

table my_objects shrink space;

表已更改.

我们具体的看一下实验的结果:

SQL>

exec show_space('MY_OBJECTS','ASSMTEST');

Unformatted Blocks  .................... 0

FS2 Blocks (25-50)  ....................      1

FS3 Blocks (50-75)  ....................      1

FS4 Blocks (75-100) .................... 0

    427

Total Blocks ...........................     448

Total Bytes  ...........................           3,670,016

Total MBytes ...........................       3

Unused Blocks...........................       3

Unused Bytes ...........................       24,576

Last Used Ext FileId.................... 8

Last Used Ext BlockId................... 512

Last Used Block.........................      61

PL/SQL 过程已成功完成.

exec show_space_assm('MY_OBJECTS','ASSMTEST');

free space 25-50% Blocks:...............1

free space 50-75% Blocks:...............1

free space 75-100% Blocks:..............0

Full Blocks:.........................................427

PL/SQL 过程已成功完成. 

在执行完shrink命令后,我们可以看到,table my_objects的HWM现在降到了447的位置,而且HWM下的block的空间使用状况,full

space的block有249个,free space 为25-50%Block只有1个.