Oracle体系结构

singing 10年前

目录:

Oracle数据完整性和锁机制 
索引及优化之表分析 
表分析、约束及表间关系 
Oracle体系结构1
Oracle体系结构2 
海量数据库及分区1 
海量数据库及分区2 
海量数据库及分区3 
海量数据库及分区4 
高级SQL优化(一)  
高级SQL优化(二)  
高级SQL优化(三) 常用优化工具 
PPT和源码下载:    http://sishuok.com/forum/posts/list/6365.html
配套视频课程
    Oracle性能优化 http://sishuok.com/product/601 
    海量数据库和高级SQL优化 http://sishuok.com/product/602
 
关系模型
关系数据库是一个符合关系模型理论的数据库。 关系模型主要有以下三方面特性:
l结构性:定义良好的数据存储和访问机制
l易操作性:具有清晰定义的访问机制,通过应用能操纵数据中的结构和数据
l完整性规则:完整性规则用来管理结构和数据
     关系数据库适用简单的关系(二维表)存储数据,而关系是一个元组、元组中存储的是无序的属性值。
表是一个行(元组)和列(属性)的式关系的两维表示。 表中的每一行都有相同的列集。 关系数据库是一个数据库存储数据的关系(表)。
RDMBS
关系模型是RDMBS的基本理论依据。从本质上来说,RDMBS提供数据在数据库内的流转、存储和检索,因此可以使用应用操纵RDBMS。RDMBS区分以下两种操作:
l逻辑操作:应用指定什么样的内容被求情(What操作)。如检索teachers表中的jsbh、gzje
l物理操作:应用决定要做什么和怎么做才能获得请求的内容(How操作)。如检索上述请求RDBMS可能需要使用索引去检索要请求的行,然后从数据文件中将数据读入到内存,以及可能还有的其他一些列操作(如排序),最后返回给用户。
Oracle在RDBMS的基础上,扩展了多态、继承、用户自定义类型等面向对象的特性,因此可以说Oracle也是一个ORDBMS。
 
数据访问
    Oracle支持行业标准,对数据的访问包括三种方法:
lSQL
如查询、插入、删除、更新行;创建、修改、替换、删除对象;控制访问数据及其对象(授权);保证数据的一致性和完整性
lPL/SQL
是Oracle对SQL进行的扩展,可以支持流程控制、函数、数据类型、变量、子程序、触发器等。
lJava
Oracle数据库也可以存储Java编写的程序单元,Java存储过程是存储在数据库中并且发布到SQL的具有一定作用的Java方法。Java中可以调用PL/SQL程序,PL/SQL中也可以调用Java程序。
总体结构图
    客户端发出的SQL命令由服务器端进程响应,在内存区域内进行语法分析、编译和执行,将修改后的数据写入数据文件,再将修改信息写入日志文件,最后将SQL执行的结果反馈给用户。
 
Oracle总体体系结构
存储结构
1.物理存储结构
   (1).数据文件(一个或多个)
   (2).控制文件(也可以是多个)
(3).联机重做日志文件(两个或多个)
  
 
2.逻辑存储结构
   (1).块(Data Block):数据库数据存放在数据块中,一个数据块对应特定磁盘上字节数。块是数据库最小的逻辑存储单元。
   (2).区(Extend):由一系列连续的块组成的,其分配是单一分配的。区也是系统分配空间和回收空间的基本单位。
(3).段(Segment):表空间中特定类型的逻辑单位,由一个或多个区构成。包括数据段(Data Segment)、回滚段(Rollback Segment)、临时段(Temporary Segment)和索引段(Index Segment)
   (4).表空间:逻辑磁盘空间,由数据文件组成,是最大的逻辑存储单元。
 
 
Instance结构
Oracle数据库的管理和访问是由内存结构和进程完成的,客户端程序连接到数据库时,实际上是连接到实例的,此时Oracle实例服务分配除SGA外的内存给该客户端程序,并启动除了后台进程以外的其它相应进程。
 1.数据库进程
   (1).客户端进程(Client Processes):这些进程创建和维护运行的应用程序或Oracle工具软件代码。 大多数环境中,有单独的计算机客户端进程
   (2).后台进程(BackgroundProcesses):这些进程随数据库而启动,用于完成各种维护任务,如将块写至磁盘、维护联机重做日志、清理异常中止的进程等
   (3).服务器进程(Server Processes):与客户端进程交互,根据客户的请求来完成任务。
 
 
 
2.内存结构
(1).SGA(System Global Area):一个包含 实例数据和控制信息的共享内存区域
    (2).PGA(Program Global Area):一个包含 服务器进程和后台进程的数据和控制信息的共享内存区域 
实例与数据库文件
   RDBMS的一个重要特征是物理结构和逻辑结构是分开的,对一个方面的修改不会影响到另外一个方面。如存储在某个数据文件中的表的重命名等。
   Oracle数据库由三种文件组成,其与实例间的关系如下图:
 
 
数据文件存储机制
1.ASM
  自动存储管理(ASM、 Automatic Storage Management )是一种高性能、且易于管理Oracle数据库文件的存储解决方案。ASM与传统的文件系统和存储管理相比,包括以下几个优势:
l 简化诸如创建数据、管理磁盘空间等工作
l 提供了在所有磁盘之上的自动负载均衡,从而减少文件系统中的热点
l存储配置调整后能够进行自我平衡调整,如当增加或移除磁盘时(物理磁盘),ASM可以自动进行联机磁盘重组
2.操作系统的文件系统
  大多数数据库是存储在文件系统中的,即在一个连续的硬盘地址空间上建立的数据结构文件。所有的操作系统都有文件管理器(系统),其能在文件系统内负责分配磁盘空间给文件,同样也能从文件内收回磁盘空间。一般创建数据库时,默认的选项如果不选择ASM,则一般都是使用文件系统。
3.裸设备
裸设备就是未经文件系统格式化的磁盘分区或者逻辑卷。使用裸设备的好处是执行直接的I/O或者大缓冲区的写效率很高,因为绕过了操作系统的缓冲区。
 
创建数据库时的选项:
 
ASM存储组件
  
   Oracle能够将数据文件作为一个 ASM文件存储在 ASM磁盘组内,我们可以把ASM磁盘组看成是由ASM管理的磁盘集合的一个单元。
 
 
1.ASM磁盘
    ASM磁盘是配置给ASM磁盘组的存储设备。ASM磁盘可以是一个物理磁盘或者分区、存储阵列的逻辑单元号(LUN)、逻辑卷或者是网络存储设备。哪怕数据库在运行期间,ASM也可以添加到ASM磁盘组,也可以从ASM磁盘组中删除。将一个ASM磁盘添加到一个ASM磁盘组时,可以指定一个名字,也可以由ASM自动分配一个名字。
2.ASM磁盘组
    ASM磁盘组是管理ASM磁盘集合的逻辑单元。在磁盘组内部,包含了文件系统与数据库文件的接口。对于存储在ASM磁盘组中的文件内容,是以在所有磁盘之上以自动负载均衡的方式存储的,从而减少文件系统中的热点,因此其执行效率比得上裸设备。
3.ASM文件
  ASM文件存储在ASM磁盘组内。Oracle数据库与ASM通讯,数据文件、控制文件、联机重做日志文件和其它类型的文件均可存储为ASM文件。
4.ASM盘区
  ASM盘区是一种原始存储器,用来保存ASM文件中的内容。一个ASM盘区由一到多个ASM文件组成,每个ASM盘区拥有磁盘上的一个或多个存储单元。
5.ASM分配单元
  ASM分配单元是ASM磁盘组内用来进行分配的最基本单位。ASM分配单元是由ASM分配的一系列最小的连续磁盘空间,而一个或多个ASM分配单元组成一个ASM盘区。
 
ASM Instance
  
 
ASM实例是用来管理ASM磁盘(组)的特定实例。ASM实例和数据库实例均需要共享访问ASM磁盘组中的磁盘。ASM管理磁盘组的元数据,并向数据库实例提供规范的信息。而数据库实例无需通过ASM就能直接读写ASM磁盘。
ASM实例的构建技术与数据库实例的构建技术是相同的,如也具有SGA,但 ASM实例无法装入数据库。
 
Oracle管理文件和用户管理文件
Oracle管理文件是一种命名策略,能确保你将操作指定在对象上而不是文件上,如创建一个表空间而不指定其数据文件。另外,Oracle管理文件能够替代管理员直接管理数据库对应的操作系统文件。ASM要求使用Oracle自动管理文件。
用户管理文件恰恰相反,对数据库的操作系统文件管理是由用户自己管理的(一般是管理员负责),如创建一个表空间时需要指定其数据文件。
通过初始化参数,可以对不同类型的文件指定不同的文件系统目录,Oracle管理文件能够确保数据库创建的文件是唯一的,并且当不再需要时自动删除文件。 两种策略也可以混合使用
 
 
数据文件和表空间
  
l每个表空间由一个或多个数据文件组成
l数据库中的数据是存储在数据文件中的
l段中的数据可以跨多个数据文件,但不能跨多个表空间
l数据库必须有SYSTEM和SYSAUX表空间,任何数据库创建的时候,Oracle都会自动将第一个数据文件放在SYSTEM上
l
SYSTEM表空间包含数据字典 ,以及记录数据库元数据的一些列的数据表。 通常情况下,数据库也有一个undo表空间和临时表空间(通常命名TEMP )。
 
永久数据文件和临时数据文件
   永久表空间中存储的是持久模式对象,这些对象存储在数据文件中。
临时表空间中仅仅存储的是会话期间模式对象,本地管理的临时表空间拥有临时文件,临时文件用来处理排序等操作,当内存不足时,临时文件也存储部分本该存储在内存中的结果集(虚拟内存)。
   永久数据文件和临时数据文件的差异如下:
l持久的数据库对象从来不会存储在临时文件中
l临时文件总是设置成NOLOGGING模式,因此不会产生重做日志信息;从存储介质恢复时,也不会恢复临时文件中的数据
永久数据文件和临时数据文件的差异如下(续):
l临时文件不能被设置为只读
l不能使用ALTER DATABASE语句创建一个临时文件
l创建或者调整临时文件时,并不能确保操作系统分配给该临时文件的大小就一定能达到定义时指定的大小
l临时文件的信息是记录在数据字典视图DBA_TEMP_FILES和动态执行视图V$TEMPFILE中的,而不是DBA_DATA_FILES和V$DATAFILE中的
 
数据文件的联机和脱机
 
u每个数据文件可以是脱机的也可以是联机的,脱机则不可用(无效、不可访问)、联机则可用(有效、可访问)
u当我们要对数据文件进行备份、重命名时可以将数据文件设置为脱机模式
u表空间也可以设置为脱机或联机模式,也可以将一个联机的表空间中的一个数据文件设置为脱机模式而该表空间仍然保持为联机模式;如果将表空间设置为脱机,则其所有数据文件都变成了脱机模式
 
数据文件的结构
  
 
数据文件头包含文件自身的元数据(如大小、检查点的SCN(System Change Number)),还要包含绝对数据文件编号(在数据库内唯一标示的数据文件的编号)和相对数据文件编号(在表空间内唯一标示的数据文件的编号)
 
 
逻辑存储结构

1.逻辑结构与物理结构的关系
l 逻辑结构由数据块、区、段和表空间构成
l表空间中存储的是数据文件
l数据文件是由操作系统的磁盘块组成的,但是又划分为多个Oracle区
 
2.逻辑存储层级构成

l 一个逻辑块包含一个或多个具有相同大小的物理磁盘空间,是DB最小的逻辑存储单元
l一个区由一系列连续的块组成的,如上图24k和72k的区的数据块不同
l 一个段由一个或多个区组成,每个数据库对象消耗的存储资源都是在单一一个段里面的,不会分布在多个段上
l每个段属于且仅仅属于一个表空间,因此每个段中的区都是在一个表空间中的, 在表空间内部,段包含的区可以来自不同数据文件,而同一个区只能来自一个数据 文件
 
3.逻辑空间管理

逻辑空间管理是Oracle用来跟踪和分配表空间中的区的。当数据块对象请求一个区(存储空间)时,数据库必须拥有一个机制来找到并且提供一个区给该对象,同样地,当数据库对象不再需要该区时,数据库也必须拥有一种机制来将不再需要的区变成可自由使用的区(释放该区的资源)。
在表空间内部,Oracle基于创建对象时的存储参数来管理表空间。表空间管理有两种类型:本地管理的表空间和数据字典管理的表空间。
 
(1).本地管理表空间
Oracle默认的表空间管理模式。指在数据库中使用位图来管理表空间的区。
 
 
在表空间内部,对段的空间管理可以使用自动管理(ASSM: automatic segment space management )和手工管理(MSSM: manual segment space management )。
本地管理表空间会在数据文件的头部维护一个位图用来跟踪数据文件主体部分已占用和空闲的空间信息。位图部分的每一位指向一个相应的数据块组。当空间被分配或者被释放时,Oracle改变位图中这组空间对应的值,从而用来映射块的最新状态。
本地管理的表空间的优势又:
l避免了使用数据字典管理段
在字典管理的表空间模式下,如果对一个数据字典表或者回滚段执行一个释放操作,并且另外一个操作也执行释放操作,则会造成递归操作。
 
本地管理的表空间的优势有(续):
l自动跟踪相邻的空闲空间
这点有利于数据块空闲区的拼接
l能自动判断本地管理的区的大小
在本例管理的表空间模式下,将所有的区的大小都设置成相应的大小并覆盖其存储选项参数也可以作为一种方案
Oracle对段的管理又包含自动段空间管理和手工段空间间管理,Oracle强烈建议在本地管理表空间模式下使用自动段空间管理
 
(2).数据字典管理表空间
数据字典表空间管理是指Oracle使用数据字典管理表空间中的区。当一个区被分配、释放或者重复使用时,Oracle会更新数据字典中的相应表的记录。
例如当一个数据表需要区时,Oracle查询数据字典表并且搜索空闲的区,如果数据库找到了空间,则会修改数据字典表,并在另外一个表中插入一行。
在后台为数据库对象获取空间的SQL是一种递归SQL,其执行需要序列化,因此对性能有负面影响,鉴于此,本地管理的表空间是默认的表空间管理模式。
 
 
数据块
1.Oracle数据块和操作系统块
l在物理层面,数据库中的数据是由操作系统块组成的磁盘文件存储的
l操作系统块是操作系统能够读写的最小数据块
lOracle数据块是Oracle能够读写的最
小数据单位,其大小和结构对操作系统是未知的
l对操作系统块而言,Oracle数据块具有逻辑分离性:
p应用程序无需知道磁盘上数据的物理地址
p数据库的数据可以是不同物理磁盘上的镜像或者条状的
  
 
 
1.Oracle数据块和操作系统块
(1).数据库块的大小
l由初始化参数DB_BLOCK_SIZE设定
l每个数据库具有一个数据库块大小,在创建数据库时被设置
l除非重新创建数据库,该参数不可修改
l如果没有指定该参数,则其大小由操作系统指定,标准的大小包括4k和8k
l数据块大小可以与操作系统块大小不同,但必须是操作系统块大小的倍数
2.Oracle数据块格式
  
 
  
3.数据块空间管理
随着Oracle对数据块自底部向上填充数据,数据块头和数据行之间的空闲空间也会缩小,此外将一个可空行的数据更新成一个非空值时,也会导致空闲空间的减小。数据库管理数据块中的空闲空间其目的是优化性能和避免空间的浪费。
(1).PCTFREE
  PCTFEE参数告诉数据库,需要保留块中多大百分比的空间以预备Update操作,因此PCTREE对防止行迁移和避免空间的浪费具有重要作用。如下面的建表语句:
CREATE TABLE test_table (n NUMBER) PCTFREE 20;   
 
数据库先在数据块中增加行,引起行数据向上增长接近块头,同时块头也在向数据行增长,PCTFEE为20%,能
确保该数据块至少20%的空间是空闲的。例如,数据库能防止INSERT语句造成的块头和数据行占据整个块90%的空间而只保留10%的空闲空间情况的发生。
 
 
1.区的分配
默认情况下,当段创建的时候数据库会为其分配一个初始化区(initial extent ),区始终
存在于一个数据文件中,此时尽管还没有数据写入到该段中,初始化区中的数据依然被保留为段所专用。每一个段中的第一个数据块都包含了该段中区的目录信息。
 
 
1.区的分配
 
当初始化区填充满了且还需要分配空间时,Oracle会为段自动分配增加的区( incremental extent ),增加的区是为段分配的一个顺序的区。分配的算法取决于表空间的管理方式(本地管理的或数据字典管理的)。
 
2.区的释放
通常,如果不使用DROP命令用户段中的区不会被释放给表空间以便重新使用。11g中如果你删除了一个表中全部的数据而数据库还没有收回那些数据块以便重新使用,则可以使用DBMS_SPACE_ADMIN包删除段。能释放区的技术方法包括:
l使用在线段收缩技术从段中收回碎片
l把表移动到另外一个表空间上的另外一个表中(此时该表是新的段)
l重建索引或合并索引
l清空表
l通过释放未使用的空间修改高水位线
 
3.区的存储参数
  段通过使用存储参数(storage parameters )来决定如何为其自身分配自由空间。存储参数的优先级从高到低依次为:
l段存储参数
l表空间存储参数
l数据库存储参数
本地管理的表空间可以使用统一的区大小,也可以使用由系统自动分配的可变区大小:
l统一的区大小:可以设置一个区的大小,也可以使用默认值1M。此时表空间中的所有区的大小都是相同的;而本地管理的临时表空间也只能使用这种类型来分配空间
l自动分配的区大小:此时由Oracle来决定一个最优的额外区的大小
   本地管理的表空间中有些存储参数在表空间级的参数上不能设置,而在段级上可以设置,此时Oracle使用所有的参数来计算段中其初始化区的大小,优先级由Oralce内在算法保证。
 
1.用户段
  当创建表和索引时,Oracle默认使用段延迟创建(deferred segment creation )来更新数据库元数据。从11gR2开始,对于分区的创建使用该技术。当用户插入第一行数据到表(分区)时,Oracle为表(分区)及其索引、大对象列分配段。
段延迟创建能避免当不需要使用数据库资源时而使用了。如安装一个应用时需要成千上万的数据库对象,如果不采用该技术,则一律要这些对象分配空间,而很多的对象可能开始压根不会被使用,但这些对象消耗大量的存储资源。
可以使用DBMS_SAPCE_ADMIN管理空对象。
  自11gR2开始,使用上述包能做:
l对没有创建段的空表(分区)手动物理化段
l对分配了一个空段的空表(分区)收回段
假定禁用了段延迟创建,执行CREATE TABLE test_table (my_column NUMBER); ,则如下图:
 
而建表时带有主键或唯一索引创建的语句时,同样假定禁用了段延迟创建,执行:
CREATE TABLE lob_table (my_column NUMBER PRIMARY KEY, clob_column CLOB); ,则如上图。
  可见隐式的同步创建了其它三个段。
 
2.临时段
  当处理查询时,Oracle对于SQL的执行需要使用临时空间用来处理排序、散列和合并位图。创建索引时,Oracle也是先把数据放在临时段待索引创建完成后再放到永久段中。
    如果内存够用,则Oracle不会创建临时段,当不够用时会自动分配临时段,类似于OS的虚拟内存。
(1).为查询分配临时段
Oracle对查询执行时临时段的创建、使用和删除是自动的,临时段的创建是在用户的临时表空间中的。推荐的做法是为临时段至少创建一个临时表空间。
(2).为临时表和索引分配临时段
Oracle也可以对临时表和它们的索引分配临时段,临时表仅仅在会话期间才会持有数据,每个会话仅仅能访问分配给它的临时区,而不能访问其它区的。
当向临时表中插入第一行数据时,Oracle为其分配段。CREATE TABLE AS SELECT明确了何时发生第一次插入。第一次插入数据时,Oracle为临时表及其索引分配段,创建索引段的根节点,分配大对象的段。
    同样,对临时表空间的段分配也是在临时表空间中的。
3.回滚段
  回滚段用来:
l回滚活动事务
l恢复中端的事务
l防止读一致性
l执行某些闪回操作
  Oracle将回滚数据存储在数据库内部是要优于存储在外部文件中的,回滚数据也是以块的形式存储的,此点跟存储update数据是一样的,也同样会产生重做日志。通过这种机制,Oracle无需访问外部文件就能有效访问回滚数据。回滚数据存储在UNDO表空间中,Oracle通过 自动回滚模式进行管理。
(1).回滚段和事务
事务启动时,Oracle将其绑定到一个回滚段。多个事务也可以并发的操作一个回滚段或者不同的回滚段。
(2).事务回滚段
    当ROLLBACK命令发出后,Oracle使用回滚数据替换尚未提交的更新。
 
表空间
 
SYSTEM和SYSAUX表空间是必须得有的。其它内容在前面章节介绍过,此处不再赘述。
 
 
习题
1.关系模型有那些特性?
2.Oracle对数据的操作有那些方式?RDBMS为什么要对数据的分为逻辑操作和物理操作,其好处是什么?我们日常的操作属于什么操作?
3.什么是ASM,请画出ASM够成图并解释ASM实例和数据库实例的相同点和不同点。
4.数据库表空间管理方式有几种?为什么说本地管理的表空间更好?
5.假设一个表空间有3个数据文件,将其中一个设置为脱机可以吗?如果将表空间设置为脱机会发生什么?
6.画出数据文件结构图,并解释数据文件头包含的内容。
7.画出逻辑存储结构层次图,并解释各个层次之间的关系。
8.画出数据块结构图,并解释各个部分的含义。
9.什么情况下会产生行链,什么时候会产生数据迁移?绘图并加以解释
10.段包括那几种类型?区和段之间的关系是什么?