Oracle-体系架构二

接上篇Oracle-体系架构一,学习Oracle体系架构之数据库文件。

目录

  1. 数据库文件
  2. 数据逻辑和物理结构
  3. 表空间的管理方式
  4. 逻辑存储结构关系图
  5. Block
  6. ROW ID
  7. Compress for OLTP
  8. 链式行
  1. 数据库文件
    Oracle-体系架构二_第1张图片
    数据库文件.png
    相对重要的文件
    control files:data files、online redo log files

    Archive log files 在线数据库都需设置成归档的-保证数据不丢失
    alert and trace log files 可帮助排查问题
  2. 数据库的逻辑和物理结构


    Oracle-体系架构二_第2张图片
    数据库的逻辑和物理结构.png

    1)一个Database中可以有多个schema
    2)一个Database中可以有多个tablespace,对应着多个 data file。
    可以对每个tablespace 设置不同的block
    不同尺寸的数据块需使用不同buffer cache

  1. 一个tablespace中有多个Segment(表、索引)
    4)一个Segment中可以有多个Extent(extent 必须是一群连续的数据块),对应到data file,不跨数据文件;理解extent有助于理解 单块读和多块读。
    5)一个Extent中可以有多个Oracle data block--oracle 逻辑存储的最小单位,对应着多个 os block。
  1. 表空间的管理方式
    UNIFORM
    统一指定每个extent的大小
    能确定空间能用满extent所分的空间时-使用
    AUTOALLOCATE
    分别指定初始extent和后续extent的大小
    这里待学习-因和网上写表空间的管理方式出入较大,当前不知道缘由。
  2. 逻辑存储结构关系图
    Oracle-体系架构二_第3张图片
    extent.png
    记:每个extent是连续的数据块
  3. Block


    Oracle-体系架构二_第4张图片
    block.png

    common and varible header--数据块头信息(块地址、块所属段、段所属类型-表、索引)
    table directory--表目录区,表数据行的信息存放
    Row directory--数据目录区,如:100行数据的目录信息
    Free space--pctfree预留多少空间不用
    row data--存放具体的数据,一个数据块放不下一行数据时分多个数据块存放

  4. ROW ID
    ROW ID 是定位数据块中一条记录的相对唯一地址,通过ROW ID能最快地找到一条记录。(通过ROW ID可减少IO)
    引起Row ID变化的情况有:
  1. 更新分区键--一个分区就是一个单独segment
  2. 导入导出
  3. shrink(压缩空间),move(搬走),flashback(还原后位置已变化)
    Row ID的组成由18位字符组成(AAAO0f AAF AAAAlm AAA)第一个六位:对象号 第二个三位:文件号 第三个六个:块号 第四个三个:行号。
    可通过DBMS_ROWID包来查看。--后续出oracle系统包的学习记录。

补充知识点
数据默认从134块开始写,前128块为初始块-存放数据文件的位图信息。129-133存在段头的信息。134块开始写数据。

  1. Compress for OLTP
    Oracle-体系架构二_第5张图片
    compress1.png
    压缩的过程:Oracle的OLTP表压缩专门设计了一个“唯一”(unique)压缩算法来处理OLTP应用程序。该算法通过消除同一个数据库块内重复的值(这些值可以是跨越不同列的)来达到压缩的目的。压缩过后的块包含一个称为符号表的结构来保持压缩的元数据。当数据库块被压缩的时候,首先在符号表中为重复值添加一个副本,然后将这个重复值删除,这样每一个重复的值都可以被一个指向符号表中对应条目的一个更短的引用所替代。
    压缩的好处:节省空间,减少IO操作、减少备份和恢复的时间
    压缩的触发:当数据量达到之前预设的阈值时-批量对块中已有数据做压缩
    Oracle-体系架构二_第6张图片
    compress2.png
    OLTP表压缩不支持多与255列的表及LONG类型数据
  2. 链式行
    行链接和行迁移
    引起行链接:
  1. 单行超过255字段
  2. 一行数据的字节数操作一个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
#第三行和第六行数据发生了迁移

你可能感兴趣的:(Oracle-体系架构二)