Oracle存储结构

  • 格式:docx
  • 大小:22.30 KB
  • 文档页数:11

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle 存储结构分析

一逻辑结构的层次与种类

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的分配和重新分配

-当创建段时就分配空间

-当扩展段时给它分配空间

-强制分配空间给段(段可以跨数据文件,但不可以跨表空间;但是强制的段是不能跨数据文件获取空间的)

创建表时,最初始的空间一定会分配给它!

五【实验】强制分配分区

1,我们想给hr.hello表在system01.dbf上划分1M的空间,

结果:ORA-03284: 数据文件d:/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员

2,现在我们给bkeep表空间增加一个数据文件bkeep03.dbf

3,再来给hr.hello表在bkeep03.dbf上强制划分1M空间

4,这里我们不指定数据文件,那么会不会是在建表的时候指定的那个数据文件上继续扩展呢?

【思考】强制分配空间的时候会指定一个数据文件,当给该表分配的空间使用完以后,它将会怎么办?继续从该数据文件上面获取空间?还是从由local manage随机分配空间给它?

答案:

【重点】drop table xxx 和 truncate table xxx 都会释放存储空间

回收 hr.hello表没有用掉的空间

【记忆】data file分区的使用情况记录在文件的头(file hearder)里面;主要有两种信息:Used extent和Free extent

六database block 的大小

I/O读写的最小单位:读整个块到内存去;同理,内存的使用也以块大小为单位

块的大小是在创建表空间时指定的

DB_BLOCK_SIZE这个参数指定了缺省的块大小

七【实践检验真理】非标准块的使用方法:验证db_16k_cache_size值的影响

oracle现在支持多种块大小的表空间,但是要使用这个功能,必须指定支持对应块大小的内存缓存区!

step1:查看内存区为16k块分配的cache大小;结果:0

step2:创建表空间bkeep2 并指定其blocksize 为16KB;结果:报错

step3:为16k的block在内存中设置缓存;结果:没有足够内存来增加高速缓存的大小

step4:收缩其它缓存来给16k block 来用;结果:标准块缓存12 4, 腾出了8m

step5:现在创建块大小为16kB的表空间bkeep2 ;结果:成功!

step6:现在又想db_16k_cache_size=0;结果:bkeep2表空间在用,所以不能设为0

step7:把bkeep2表空间连同内容和数据文件全部删除,再来设

db_16k_cache_size=0 ;结果:ok!

【思考】块大小为8k;设对应的cache有如下特点。。

db_cache_size=9m 结果:12M

db_cache_size=5m 结果:8M

八块的研究

header: 有多少行!使用空间的方式是 "自上往下"

free space: 保留用于更新的空闲空间

Data: 数据的填充方式是 "自下往上 "

块一级控制对空间的使用

总共有四个参数:PCTFREE、PCTUSED、INITRANS、MAXTRANS

PCTFREE

PCTUSED

【优化有关】用上面两个参数来控制块中预留的空间大小。为什么要预留空间呢? 为了将来更新时防止数据变大而导致行移植!