不为失败找借口,只为成功找方法!
分类: Oracle
2011-11-29 20:50:35
1、段(Segments)的类型:
sql>create table kong.test1 (id int) tablespace kong
storage(initial 100k next 100k);
【注意】如果我们创建表空间或建立表空间下的段数据时不指定任何存储参数就会使用Oracle默认存储参数
Oracle默认存储参数=5倍 的blocks 块大小(5×db_block_size)。
存储参数优先级:Oracle defualt < Tablespaces < Segment
2、段的Extend Allocation 分区扩展和Deallocation 分区释放
(1)段的Extend Allocation 分区扩展:
sql>create tablespace kong1 datafile 'd:\oracle\oradata\fox\kong1' size 10m;
sql>create table kong.test11(id int) tablespace kong1;
创建表会自动分配到自己的初始分区(Create)。如:
sql>create table kong.test12(id int) tablespace kong1 storage(initial 100k next 100k); //创建后自动分配到最初始分区100k
当初始分区用完以后需要申请空间扩展时,可以进行手工进行分配空间(Extend),也可以进行强制给段进行空间分配(Alter),但指定空间来源一定是原来段所在表空间的数据文件底下。例如:
【注意】段可以跨数据文件但是不能跨表空间。
sql>alter table kong.test12
allocate extent(size 1m datafile 'd:\oracle\oradata\fox\kong') ;//注意:数据文件d:\oracle\oradata\fox\kong不是表空间KONG1的成员。
sql>alter table kong.test12
allocate extent(size 1m datafile 'd:\oracle\oradata\fox\kong1'); //数据文件kong1一定是属于kong1表空间
(2)段的Extend Allocation 分区释放:
sql>drop table kong.test12; //删除表,空间被释放
sql>truncate table kong.test11; //清空表,空间被释放
sql>drop table kong.test11;
sql>alter table kong.authors deallocate unused; //释放没有用掉的分区
sql>input keep 0
3、Database Block 块
块Block:I/O读写的最小单位。内存也是以块大小为单位。
sql> create tablespace kong2
datafile 'd:\oracle\oradata\fox\kong2.dbf' size 10m
blocksize 8k; //表空间块大小8192k 与配置的块大小不匹配。
sql>show parameter db //查看内存参数db_8k_cache_size (8k高速缓存大小)没有指定,只指定了db_block_size:4096(4k)的内存默认分区大小。
【注意】Oracle支持多块大小的使用,在此之前必须设定相应的内存区域,即指定对应块大小的高速缓存区域,它在Database Blocksize 在创建表空间时创建。DB_BLOCK_SIZE指定了默认块的大小。DB_CACHE_SIZE是为DB_BLOCK_SIZE服务的。
sql>alter system set db_8k_cache_size=10m ; //没有足够的内存来增加高速缓存的大小
sql>alter system set db_cache_size=10m ;// 将内存区域收缩到10m
sql>alter system set db_8k_cache_size=10m; //将8k缓存区域设置为10m.
Database Block Content 块内容:相当于将一个长方体从上到下切成三份: Header 头(Top)、Free space 自由空间(middle)、Data 数据(Bottom)
原理:Top Down 从头顶部往下 ,Bottom up:从数据底部往上 进行压缩。压缩在中间剩余部分即是自由空间。
4、Block控制表空间的使用:
(1)BLOCK管理参数: INITRANS\MAXTRANS、PCTFREE\PCTUSED
INITRANS\MAXTRANS 初始值(1)\最大值(255)事务处理数量,用于控制块中预留的Transaction空间。
PCTFREE 用来预留多少空间来满足将来的数据改变,实现行移植(Row migration),成倍的增加了I/O量,对系统是有性能影响的。PCTUSED 块使用率控制,控制块使用最小的百分比(如在数据删除过程中,删除到还剩多少空间时可以通告Oracle该块可以继续使用)
(2)Data Block 管理2种方式:自动段空间管理、手工配置Block管理
自动段空间管理:段中自动管理自由空间free space;通过使用位图段来跟踪当前段中自由的(free)和已用的(used)的block空间(相反,手工管理是使用free lists 空闲列表来管理)
好处:易于管理、更好的空间利用率,更好的性能,
注意:如果包含大的数据对象(LOBs)则不可以使用自动段空间管理的方式。
CREATE TABLESPACE data02
DATAFILE '/u01/oradata/data02.dbf' SIZE 5M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K
SEGMENT SPACE MANAGEMENT AUTO;
sql>create tablespace kong3
datafile 'd:\oracle\oradata\fox\kong3.dbf' size 10m
extent management local uniform size 1m
segment space management auto;
注意:表空间建立后,所有建立在上面的数据段(表或索引)会自动继承这些特性。
sql>create table kong.test11(id int) tablespace kong3; //此时test11表的空闲列表没有指定,它是本地管理的。
手工配置Block管理:
使用参数:PCTFREE、PCTUSED、FREELIST (在以前的Oracle8i版本中这是唯一的方法)
5、获取存储结构的相关信息(数据字典视图)
多对一关系:
逻辑上:Used extents 已用区记录了每个数据对象 (DBA_EXTENTS) > 段Segments(DBA_SEGMENTS) > 表空间(DBA_TABLESPACES)
物理上:Free extents 自由空间(DBA_FREE_SPACE)> 数据文件Datafiles(DBA_DATA_FILES) > 表空间(DBA_TABLESPACES)
sql>conn as sysdba
sql>select * from dba_tablespaces;
sql>select * from dba_segments; //包括回滚段、临时段等
sql>select * from dba_extents; //每一个数据段记录(表、索引等)
sql>desc dba_extents; //列出dba_extents的参数
sql>select sum(bytes) from dba_extents where owner='KONG' and segment_name='AUTHORS'; //查出表空间为"KONG",段为"AUTHORS"的数据对象所占用的总大小,显示为65536(64k)
sql>select * from dba_free_space; //查出自由空间。