24、oracle存储结构: 表空间/数据文件/段/分区/块
2012-02-29 15:29
513 查看
一,段的种类
1,表(table):
2,分区表(table partition):一个有很大数据量的表;我们可以把表分区,每个分区可以放在不同的段上。以实现对表的优化
3,簇(cluster):将多个表集合在一起,这些表拥有相同的列;这些相同列放在同一个物理的段里面。
4,索引(index):
5,index-organized table(对应sqlserver的群集索引):这些表中的数据以索引的大小按升序或者降序排列
6,index partition(索引的分区):关于索引的数据分别存于不同的物理段里面
7,undo segment:有序循环的方式存储
(存放old value;读一致性;rollback; recovery)
8,temporary:临时段用来排序
9,LOB segment:存放大的数据,oracle里面将这些数据并不放在表内部,而是有专门一个段来存储
10,nested table(嵌套表):一个表中的某个字段的值是另外一个整表!
11,bootstrap segment:初始化我们的实例用的。这个段不需要维护和管理!
二,oracle存储参数的设定及继承问题
【记忆】默认为 Oracle default ===》 Tablespace (创建表空间时定义的参数)
====》 Segment(优先级最高)
【理解】初始参数 oracle block的5倍;意思是说你创建一个表,即使里面没存数据,它已经占用了8k×5=40kB的空间(这里假设oracle
block size为8kB)
三,创建表时可以单独为表指定存储参数
SQL> conn hr/123456@kk
已连接。
SQL> create table hello(id int)
2 tablespace bkeep
3 storage(initial 100k
4 next 100k);
【点子】我们来创建一个表空间test11,不带任何存储参数,然后打开oem看看它的存储参数(这些参数就是从oracle
default哪里继承过来的!)
四,extent的分配和重新分配
- 当创建段时就分配空间
- 当扩展段时给它分配空间
- 强制分配空间给段(段可以跨数据文件,但不可以跨表空间;但是强制的段是不能跨数据文件获取空间的)
创建表时,最初始的空间一定会分配给它!
SQL> create table hello(id int)
2 tablespace bkeep
3 storage(initial 100k
//意思是,不管表里面有没有数据,都会占掉100k的空间
4 next 100k);
表已创建。
五,【实验】强制分配分区
1,我们想给hr.hello表在system01.dbf上划分1M的空间,
结果:ORA-03284:数据文件d:/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员
SQL> alter table hr.hello
2 allocate extent(size 1m datafile 'd:/oracle/oradata/kk/system01.dbf');
alter table hr.hello
*
ERROR位于第 1行:
ORA-03284:数据文件d:/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员
2,现在我们给bkeep表空间增加一个数据文件bkeep03.dbf
SQL> alter tablespace bkeep
2 add datafile 'd:/oracle/oradata/kk/bkeep03.dbf' size 10M;
3,再来给hr.hello表在bkeep03.dbf上强制划分1M空间
SQL> alter table hr.hello
2 allocate extent(size 1m datafile 'd:/oracle/oradata/kk/bkeep03.dbf');
4,这里我们不指定数据文件,那么会不会是在建表的时候指定的那个数据文件上继续扩展呢?
SQL> alter table hr.hello
2 allocate extent(size 1m);
【思考】
强制分配空间的时候会指定一个数据文件,当给该表分配的空间使用完以后,它将会怎么办?继续从该数据文件上面获取空间?还是从由local manage随机分配空间给它?
答案:
【重点】drop table xxx和 truncate table xxx 都会释放存储空间
回收 hr.hello表没有用掉的空间
SQL> alter table hr.hello
2 deallocate unused;
【记忆】data file分区的使用情况记录在文件的头(file
hearder)里面;主要有两种信息:Used extent和Free extent
六,database block的大小
I/O读写的最小单位:读整个块到内存去
;同理,内存的使用也以块大小为单位
块的大小是在创建表空间时指定的
DB_BLOCK_SIZE这个参数指定了缺省的块大小
七,【实践检验真理】非标准块的使用方法: 验证db_16k_cache_size值的影响
oracle现在支持多种块大小的表空间,但是要使用这个功能,必须指定支持对应块大小的内存缓存区!
step1:查看内存区为16k块分配的cache大小;结果:0
SQL> show parameter db_16k_cache_size
NAME TYPE
VALUE
------------------------------------ ----------- ----------------
db_16k_cache_size big integer
0
step2:创建表空间bkeep2并指定其blocksize
为16KB;结果:报错
SQL> create tablespace bkeep2
2 datafile 'd:/oracle/oradata/kk/bkeep202.dbf' size 10m
3 blocksize 16k;
create tablespace bkeep2
*
ERROR位于第 1行:
ORA-29339:表空间块大小 16384与配置的块大小不匹配
step3:为16k的block在内存中设置缓存;结果:没有足够内存来增加高速缓存的大小
SQL> alter system set db_16k_cache_size=8m;
alter system set db_16k_cache_size=8m
*
ERROR位于第 1行:
ORA-02097:无法修改参数,因为指定的值无效
ORA-00384:没有足够的内存来增加高速缓存的大小
step4:我们收缩其它缓存来给16k block
来用;结果:标准块缓存12à4,腾出了8m
SQL> alter system set db_cache_size=4m;
系统已更改。
SQL> alter system set db_16k_cache_size=8m;
系统已更改。
SQL> show parameter db
NAME TYPE VALUE
------------------------------------ -----------
---------------------------
db_16k_cache_size big integer
8388608
db_8k_cache_size big integer
0
db_block_size integer
8192
step5:现在创建块大小为16kB的表空间bkeep2;
结果:成功!
SQL> create tablespace bkeep2
2 datafile 'd:/oracle/oradata/kk/bkeep202.dbf' size 10m
3 blocksize 16k;
step6:我现在又想db_16k_cache_size=0;结果:bkeep2表空间在用,所以不能设为0
SQL> alter system set db_16k_cache_size=0;
alter system set db_16k_cache_size=0
*
ERROR位于第1
行:
ORA-02097:无法修改参数,因为指定的值无效
ORA-00383: DEFAULT高速缓存的块大小 16384不能减少至零
step7:我把bkeep2表空间连同内容和数据文件全部删除,再来设db_16k_cache_size=0;结果:ok!
SQL> run
1 drop tablespace bkeep2
2* including contents and datafiles
SQL> alter system set db_16k_cache_size=0;
系统已更改。
【思考】块大小为8k;我设对应的cache有如下特点。。搞不明白
db_cache_size=9m 结果:12M
db_cache_size=5m 结果:8M
SQL> show parameter db_cache;
NAME TYPE
VALUE
------------------------------------ -----------
---------------
db_cache_size big integer
8388608
SQL> alter system set db_cache_size=9m;
SQL> show parameter db_cache;
NAME TYPE
VALUE
------------------------------------ -----------
---------------
db_cache_size big integer
12582912
SQL> show parameter db_b
NAME TYPE
VALUE
------------------------------------ -----------
---------------
db_block_size integer
8192
八,块的研究
header:有多少行!
使用空间的方式是 "自上往下"
free space:保留用于更新的空闲空间
Data:数据的填充方式是
"自下往上 "
块
一级控制对空间的使用
总共有四个参数:PCTFREE、PCTUSED、INITRANS、MAXTRANS
PCTFREE
PCTUSED
【优化有关】用上面两个参数来控制块中预留的空间大小。
为什么要预留空间呢? 为了将来更新时防止数据变大而导致行移植!
为什么要避免行移植呢?行移植的意思就是一行记录被放到两个块里面,之间做了指针链接;将来查询这个数据的时候会读取两个块中的全部内容(block是最小读写单位),这样的话I/O负担就翻了一倍!
【说明】
PCTFREE=20 是20%
控制insert,为了给将来update用!!呵呵,偏心吧!
九,查看表的存储参数,在OEM里面
"事务处理数量" ----‘初始值’对应‘INITRANS’‘最大值’对应‘MAXTRNS’
意思是:初始值允许一个事务对这个块的操作,最大的事务数量是255
十,data block的管理
自动段空间管理
手工管理段空间
自动段管理 --推荐使用
1,借助位图来跟踪当前段的free和use空间
2,对并发数据的插入有更好的性能!
【疑问】如果表空间中包含LOBs对象,那么就不能使用自动段管理(难道我们的系统。。。。???天哪!)
【常识】只能在创建表空间的时候指定段管理;以后在这个表空间中创建的对象都将继承它的段管理特性
【点子】在kong3表空间中创建表test11
OEM中查看表test11的存储特性
“空闲列表”为灰色的,说明它是自动管理的
十一,【重点】如何通过字典视图查看空间管理信息??
每个对象所占有的分区都记录在DBA_EXTENTS里面
表空间还有多少自由空间? DBA_FREE_SPACE
表空间从物理上有“数据文件”组成;从逻辑上由“段”组成
物理线路:DBA_TABLESPACES--àDBA_DATA_FILES--à
DBA_FREE_SPACE + DBA_EXTENTS
逻辑线路:DBA_TABLESPACES--àDBA_SEGMENTS---à
DBA_FREE_SPACE + DBA_EXTENTS
【重点】
这五个视图监控了系统存储这块的非常有用的信息;必须高度重视,经常使用!
DBA_TABLESPACES
DBA_SEGMENTS
DBA_DATA_FILES
DBA_FREE_SPACE
DBA_EXTENTS
【技巧】如何判断表空间是local管理还是数据字典管理
SELECT * FROM DBA_TABLESPACE
可以看到“表空间名称”“block_size”“初始分区”“next分区”如果“next分区”为空,说明是local管理
【技巧】计算price表所占空间
每个对象所占用的分区都记录在DBA_EXTENTS视图里面
根据这个,我们可以计算authors表所占的空间
计算price表所占空间
SQL> SELECT sum(bytes) from dba_extents
where owner='HR' and segment_name='PRICE'
SUM(BYTES)
----------
65536
【记忆】表空间的作用:
分离段,方便管理
控制用户空间的分配(普通表,分区表,cluster,LOBs等等)
1,表(table):
2,分区表(table partition):一个有很大数据量的表;我们可以把表分区,每个分区可以放在不同的段上。以实现对表的优化
3,簇(cluster):将多个表集合在一起,这些表拥有相同的列;这些相同列放在同一个物理的段里面。
4,索引(index):
5,index-organized table(对应sqlserver的群集索引):这些表中的数据以索引的大小按升序或者降序排列
6,index partition(索引的分区):关于索引的数据分别存于不同的物理段里面
7,undo segment:有序循环的方式存储
(存放old value;读一致性;rollback; recovery)
8,temporary:临时段用来排序
9,LOB segment:存放大的数据,oracle里面将这些数据并不放在表内部,而是有专门一个段来存储
10,nested table(嵌套表):一个表中的某个字段的值是另外一个整表!
11,bootstrap segment:初始化我们的实例用的。这个段不需要维护和管理!
二,oracle存储参数的设定及继承问题
【记忆】默认为 Oracle default ===》 Tablespace (创建表空间时定义的参数)
====》 Segment(优先级最高)
【理解】初始参数 oracle block的5倍;意思是说你创建一个表,即使里面没存数据,它已经占用了8k×5=40kB的空间(这里假设oracle
block size为8kB)
三,创建表时可以单独为表指定存储参数
SQL> conn hr/123456@kk
已连接。
SQL> create table hello(id int)
2 tablespace bkeep
3 storage(initial 100k
4 next 100k);
【点子】我们来创建一个表空间test11,不带任何存储参数,然后打开oem看看它的存储参数(这些参数就是从oracle
default哪里继承过来的!)
四,extent的分配和重新分配
- 当创建段时就分配空间
- 当扩展段时给它分配空间
- 强制分配空间给段(段可以跨数据文件,但不可以跨表空间;但是强制的段是不能跨数据文件获取空间的)
创建表时,最初始的空间一定会分配给它!
SQL> create table hello(id int)
2 tablespace bkeep
3 storage(initial 100k
//意思是,不管表里面有没有数据,都会占掉100k的空间
4 next 100k);
表已创建。
五,【实验】强制分配分区
1,我们想给hr.hello表在system01.dbf上划分1M的空间,
结果:ORA-03284:数据文件d:/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员
SQL> alter table hr.hello
2 allocate extent(size 1m datafile 'd:/oracle/oradata/kk/system01.dbf');
alter table hr.hello
*
ERROR位于第 1行:
ORA-03284:数据文件d:/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员
2,现在我们给bkeep表空间增加一个数据文件bkeep03.dbf
SQL> alter tablespace bkeep
2 add datafile 'd:/oracle/oradata/kk/bkeep03.dbf' size 10M;
3,再来给hr.hello表在bkeep03.dbf上强制划分1M空间
SQL> alter table hr.hello
2 allocate extent(size 1m datafile 'd:/oracle/oradata/kk/bkeep03.dbf');
4,这里我们不指定数据文件,那么会不会是在建表的时候指定的那个数据文件上继续扩展呢?
SQL> alter table hr.hello
2 allocate extent(size 1m);
【思考】
强制分配空间的时候会指定一个数据文件,当给该表分配的空间使用完以后,它将会怎么办?继续从该数据文件上面获取空间?还是从由local manage随机分配空间给它?
答案:
【重点】drop table xxx和 truncate table xxx 都会释放存储空间
回收 hr.hello表没有用掉的空间
SQL> alter table hr.hello
2 deallocate unused;
【记忆】data file分区的使用情况记录在文件的头(file
hearder)里面;主要有两种信息:Used extent和Free extent
六,database block的大小
I/O读写的最小单位:读整个块到内存去
;同理,内存的使用也以块大小为单位
块的大小是在创建表空间时指定的
DB_BLOCK_SIZE这个参数指定了缺省的块大小
七,【实践检验真理】非标准块的使用方法: 验证db_16k_cache_size值的影响
oracle现在支持多种块大小的表空间,但是要使用这个功能,必须指定支持对应块大小的内存缓存区!
step1:查看内存区为16k块分配的cache大小;结果:0
SQL> show parameter db_16k_cache_size
NAME TYPE
VALUE
------------------------------------ ----------- ----------------
db_16k_cache_size big integer
0
step2:创建表空间bkeep2并指定其blocksize
为16KB;结果:报错
SQL> create tablespace bkeep2
2 datafile 'd:/oracle/oradata/kk/bkeep202.dbf' size 10m
3 blocksize 16k;
create tablespace bkeep2
*
ERROR位于第 1行:
ORA-29339:表空间块大小 16384与配置的块大小不匹配
step3:为16k的block在内存中设置缓存;结果:没有足够内存来增加高速缓存的大小
SQL> alter system set db_16k_cache_size=8m;
alter system set db_16k_cache_size=8m
*
ERROR位于第 1行:
ORA-02097:无法修改参数,因为指定的值无效
ORA-00384:没有足够的内存来增加高速缓存的大小
step4:我们收缩其它缓存来给16k block
来用;结果:标准块缓存12à4,腾出了8m
SQL> alter system set db_cache_size=4m;
系统已更改。
SQL> alter system set db_16k_cache_size=8m;
系统已更改。
SQL> show parameter db
NAME TYPE VALUE
------------------------------------ -----------
---------------------------
db_16k_cache_size big integer
8388608
db_8k_cache_size big integer
0
db_block_size integer
8192
step5:现在创建块大小为16kB的表空间bkeep2;
结果:成功!
SQL> create tablespace bkeep2
2 datafile 'd:/oracle/oradata/kk/bkeep202.dbf' size 10m
3 blocksize 16k;
step6:我现在又想db_16k_cache_size=0;结果:bkeep2表空间在用,所以不能设为0
SQL> alter system set db_16k_cache_size=0;
alter system set db_16k_cache_size=0
*
ERROR位于第1
行:
ORA-02097:无法修改参数,因为指定的值无效
ORA-00383: DEFAULT高速缓存的块大小 16384不能减少至零
step7:我把bkeep2表空间连同内容和数据文件全部删除,再来设db_16k_cache_size=0;结果:ok!
SQL> run
1 drop tablespace bkeep2
2* including contents and datafiles
SQL> alter system set db_16k_cache_size=0;
系统已更改。
【思考】块大小为8k;我设对应的cache有如下特点。。搞不明白
db_cache_size=9m 结果:12M
db_cache_size=5m 结果:8M
SQL> show parameter db_cache;
NAME TYPE
VALUE
------------------------------------ -----------
---------------
db_cache_size big integer
8388608
SQL> alter system set db_cache_size=9m;
SQL> show parameter db_cache;
NAME TYPE
VALUE
------------------------------------ -----------
---------------
db_cache_size big integer
12582912
SQL> show parameter db_b
NAME TYPE
VALUE
------------------------------------ -----------
---------------
db_block_size integer
8192
八,块的研究
header:有多少行!
使用空间的方式是 "自上往下"
free space:保留用于更新的空闲空间
Data:数据的填充方式是
"自下往上 "
块
一级控制对空间的使用
总共有四个参数:PCTFREE、PCTUSED、INITRANS、MAXTRANS
PCTFREE
PCTUSED
【优化有关】用上面两个参数来控制块中预留的空间大小。
为什么要预留空间呢? 为了将来更新时防止数据变大而导致行移植!
为什么要避免行移植呢?行移植的意思就是一行记录被放到两个块里面,之间做了指针链接;将来查询这个数据的时候会读取两个块中的全部内容(block是最小读写单位),这样的话I/O负担就翻了一倍!
【说明】
PCTFREE=20 是20%
控制insert,为了给将来update用!!呵呵,偏心吧!
九,查看表的存储参数,在OEM里面
"事务处理数量" ----‘初始值’对应‘INITRANS’‘最大值’对应‘MAXTRNS’
意思是:初始值允许一个事务对这个块的操作,最大的事务数量是255
十,data block的管理
自动段空间管理
手工管理段空间
自动段管理 --推荐使用
1,借助位图来跟踪当前段的free和use空间
2,对并发数据的插入有更好的性能!
【疑问】如果表空间中包含LOBs对象,那么就不能使用自动段管理(难道我们的系统。。。。???天哪!)
【常识】只能在创建表空间的时候指定段管理;以后在这个表空间中创建的对象都将继承它的段管理特性
【点子】在kong3表空间中创建表test11
OEM中查看表test11的存储特性
“空闲列表”为灰色的,说明它是自动管理的
十一,【重点】如何通过字典视图查看空间管理信息??
每个对象所占有的分区都记录在DBA_EXTENTS里面
表空间还有多少自由空间? DBA_FREE_SPACE
表空间从物理上有“数据文件”组成;从逻辑上由“段”组成
物理线路:DBA_TABLESPACES--àDBA_DATA_FILES--à
DBA_FREE_SPACE + DBA_EXTENTS
逻辑线路:DBA_TABLESPACES--àDBA_SEGMENTS---à
DBA_FREE_SPACE + DBA_EXTENTS
【重点】
这五个视图监控了系统存储这块的非常有用的信息;必须高度重视,经常使用!
DBA_TABLESPACES
DBA_SEGMENTS
DBA_DATA_FILES
DBA_FREE_SPACE
DBA_EXTENTS
【技巧】如何判断表空间是local管理还是数据字典管理
SELECT * FROM DBA_TABLESPACE
可以看到“表空间名称”“block_size”“初始分区”“next分区”如果“next分区”为空,说明是local管理
【技巧】计算price表所占空间
每个对象所占用的分区都记录在DBA_EXTENTS视图里面
根据这个,我们可以计算authors表所占的空间
计算price表所占空间
SQL> SELECT sum(bytes) from dba_extents
where owner='HR' and segment_name='PRICE'
SUM(BYTES)
----------
65536
【记忆】表空间的作用:
分离段,方便管理
控制用户空间的分配(普通表,分区表,cluster,LOBs等等)
相关文章推荐
- oracle存储结构: 表空间/数据文件/段/分区/块
- oracle存储结构: 表空间/数据文件/段/分区/块
- 《Oracle编程艺术》学习笔记(9)-Oracle中的文件-数据文件和存储体系(表空间/段/区段/块)
- 存储结构之数据文件和表空间
- oracle 11g 存储结构和数据文件
- ORACLE空间管理实验1:探索LMT表空间管理下数据文件头的结构及位图中区的记录方式
- Oracle物理结构与逻辑结构--(数据文件与表空间) .
- 检查存储结构-控制、REDO日志、表空间使用情况、数据文件等信息脚本--HTML
- 浅谈Oracle中物理结构(数据文件等。。。)与逻辑结构(表空间等。。。。。)
- ORACLE 收缩表空间的数据文件
- oracle 常用数据库表空间数据文件SQL
- oracle不同数据模范存储空间的实例较量
- 『ORACLE』查询表空间使用率和数据文件大小(11g)
- oracle数据文件内部BLOCK结构详解
- oracle之逻辑数据库结构概述(表空间、段、数据拓展和数据块)
- SQL SERVER大话存储结构(6)_数据库数据文件
- oracle增加表空间数据文件大小
- Oracle的表空间、数据文件、用户
- [转]Oracle 表空间与数据文件
- Oracle存储结构_文件