接上篇Oracle-体系架构一,学习Oracle体系架构之数据库文件。
目录
- 数据库文件
- 数据逻辑和物理结构
- 表空间的管理方式
- 逻辑存储结构关系图
- Block
- ROW ID
- Compress for OLTP
- 链式行
- 数据库文件
control files:data files、online redo log files
Archive log files 在线数据库都需设置成归档的-保证数据不丢失
alert and trace log files 可帮助排查问题 -
数据库的逻辑和物理结构
1)一个Database中可以有多个schema
2)一个Database中可以有多个tablespace,对应着多个 data file。
可以对每个tablespace 设置不同的block
不同尺寸的数据块需使用不同buffer cache
- 一个tablespace中有多个Segment(表、索引)
4)一个Segment中可以有多个Extent(extent 必须是一群连续的数据块),对应到data file,不跨数据文件;理解extent有助于理解 单块读和多块读。
5)一个Extent中可以有多个Oracle data block--oracle 逻辑存储的最小单位,对应着多个 os block。
- 表空间的管理方式
UNIFORM
统一指定每个extent的大小
能确定空间能用满extent所分的空间时-使用
AUTOALLOCATE
分别指定初始extent和后续extent的大小
这里待学习-因和网上写表空间的管理方式出入较大,当前不知道缘由。 - 逻辑存储结构关系图
-
Block
common and varible header--数据块头信息(块地址、块所属段、段所属类型-表、索引)
table directory--表目录区,表数据行的信息存放
Row directory--数据目录区,如:100行数据的目录信息
Free space--pctfree预留多少空间不用
row data--存放具体的数据,一个数据块放不下一行数据时分多个数据块存放 - ROW ID
ROW ID 是定位数据块中一条记录的相对唯一地址,通过ROW ID能最快地找到一条记录。(通过ROW ID可减少IO)
引起Row ID变化的情况有:
- 更新分区键--一个分区就是一个单独segment
- 导入导出
- shrink(压缩空间),move(搬走),flashback(还原后位置已变化)
Row ID的组成由18位字符组成(AAAO0f AAF AAAAlm AAA)第一个六位:对象号 第二个三位:文件号 第三个六个:块号 第四个三个:行号。
可通过DBMS_ROWID包来查看。--后续出oracle系统包的学习记录。
补充知识点
数据默认从134块开始写,前128块为初始块-存放数据文件的位图信息。129-133存在段头的信息。134块开始写数据。
- Compress for OLTP
压缩的好处:节省空间,减少IO操作、减少备份和恢复的时间
压缩的触发:当数据量达到之前预设的阈值时-批量对块中已有数据做压缩
- 链式行
行链接和行迁移
引起行链接:
- 单行超过255字段
- 一行数据的字节数操作一个block块大小-需要多个块
如:每个字段2000字节,共5个字段,一行记录为10000,而一个块8K,则需要两个块。
可通过select * from chained_rows查看,chained_rows表需通过@?/rdbms/admin/utlchain.sql创建
create table test_row_chain(name1 varchar2(2000),name2 varchar2(2000),name3 varchar2(2000),name4 varchar2(2000),name5 varchar2(2000));
insert into test_row_chain values('x','y','z','e','f');
update test_row_chain set name1=rpad('a',2000,'c');
update test_row_chain set name2=rpad('x',2000,'z');
update test_row_chain set name3=rpad('x',2000,'z');
update test_row_chain set name4=rpad('x',2000,'z');
update test_row_chain set name5=rpad('x',2000,'z');
analyze table test_row_chain list chained rows;
select * from chained_rows;
引起行迁移:
1)pctfree -剩余空间就无法存放多余出来的字节(一次IO变两次IO,行搬家后,新行地址存放在老行上)
实例:表有三个字段,一个字段10字节,一个字段990,一个字段500字节,插入1,2,null,字节为1000,插入10条数据,共10000字节。前7条数据在一个数据块中-剩余空间不到1000字节,后3条数据在一个块中,8k空间预留了5%空间。
往字段3上插入数据,每一行记录多了500字节,7行共3500字节。
第一行、第二行记录放在第一个块中,第三行记录因无多余空间,第三行迁移走。
SQL> CREATE TABLE test_row_chain2 (name1 char(10),name2 char(990),name3 char(500));
SQL> insert into test_row_chain2 values('1','1',null);
SQL> insert into test_row_chain2 values('2','2',null);
SQL> insert into test_row_chain2 values('3','3',null);
SQL> insert into test_row_chain2 values('4','4',null);
SQL> insert into test_row_chain2 values('5','5',null);
SQL> insert into test_row_chain2 values('6','6',null);
SQL> insert into test_row_chain2 values('7','7',null);
SQL> insert into test_row_chain2 values('8','8',null);
SQL> insert into test_row_chain2 values('9','9',null);
SQL> insert into test_row_chain2 values('10','10',null);
SQL> commit;
SQL> select rowid,dbms_rowid.rowid_block_number(rowid) block,name1 from test_row_chain2;
ROWID BLOCK NAME1
AAAejzAABAAAcNxAAA 115569 1
AAAejzAABAAAcNxAAB 115569 2
AAAejzAABAAAcNxAAC 115569 3
AAAejzAABAAAcNxAAD 115569 4
AAAejzAABAAAcNxAAE 115569 5
AAAejzAABAAAcNxAAF 115569 6
AAAejzAABAAAcNxAAG 115569 7
AAAejzAABAAAcNyAAA 115570 8
AAAejzAABAAAcNyAAB 115570 9
AAAejzAABAAAcNyAAC 115570 10
SQL> select rowid,dbms_rowid.rowid_block_number(rowid) block ,name1 from test_row_chain2;
ROWID BLOCK NAME1
AAAejzAABAAAcNxAAA 115569 1
AAAejzAABAAAcNxAAB 115569 2
AAAejzAABAAAcNxAAD 115569 4
AAAejzAABAAAcNxAAE 115569 5
AAAejzAABAAAcNxAAG 115569 7
AAAejzAABAAAcNyAAA 115570 8
AAAejzAABAAAcNyAAB 115570 9
AAAejzAABAAAcNyAAC 115570 10
AAAejzAABAAAcNxAAC 115569 3
AAAejzAABAAAcNxAAF 115569 6
#第三行和第六行数据发生了迁移