测试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):   在9iR2版本后成了默认的选项

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

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

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

在每个表空间的数据文件的头部加入了一个位图区域 
一个段的第一个区的第一个块是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:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
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;
Grant succeeded.


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';

然后我们随机地从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

PL/SQL procedure successfully completed.


这里,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
FS1 Blocks (0-25)   ....................       0
FS2 Blocks (25-50)  ....................      1
FS3 Blocks (50-75)  ....................      1
FS4 Blocks (75-100) .................... 0
Full Blocks    ....................     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 过程已成功完成.
SQL> exec show_space_assm('MY_OBJECTS','ASSMTEST');
free space 0-25% Blocks:................0
free space 25-50% Blocks:...............1
free space 50-75% Blocks:...............1
free space 75-100% Blocks:..............0
Full Blocks:.........................................427
Unformatted blocks:.....................0

PL/SQL 过程已成功完成. 


在执行完shrink命令后,我们可以看到,table my_objects的HWM现在降到了447的位置,而且HWM下的block的空间使用状况,full space的block有249个,free space 为25-50%Block只有1个.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值