Oracle数据库:功能、架构与管理深度解析
1. 引言
Oracle作为数据库领域的领军企业,自1977年成立以来,始终保持在关系型数据库市场的领先地位。随着时间的推移,Oracle的产品线不断丰富,涵盖了数据库管理系统、商业智能工具、企业资源规划软件等多个领域。本文将深入探讨Oracle数据库的设计工具、查询工具、SQL扩展、存储与索引、查询处理与优化、并发控制与恢复、系统架构、复制与分布式处理以及数据库管理工具等方面的内容。
2. 设计与查询工具
2.1 数据库设计工具
Oracle提供了一系列用于数据库设计的工具,其中大部分包含在Oracle Internet Development Suite中。该套件支持UML标准,可用于生成Java业务组件代码和进行通用控制流建模,还支持XML数据交换。
- Oracle Designer :是核心的数据库设计工具,它能将业务逻辑和数据流转换为应用程序的模式定义和过程脚本。支持多种建模技术,如E - R图、信息工程和面向对象分析设计。设计结果存储在Oracle Repository中,该仓库作为应用程序的元数据单点,可用于生成表单和报表。
- Oracle Warehouse Builder :用于数据仓库的设计和实现,支持3FN和星型模式,还能导入Oracle Designer的设计。
2.2 查询工具
Oracle提供了用于查询、报表生成和临时数据分析的工具,包括OLAP。
- Oracle Discoverer :基于Web的工具,供最终用户和数据分析师进行临时查询、报表生成、分析和Web发布。用户可抽象和具体化数据透视结果集,并将计算结果存储为报表。它包含可视化助手,且其查询界面可生成SQL,利用Oracle9i的分析功能为用户提供丰富的分析能力。
- Oracle Express Server :多维数据库服务器,支持多种分析查询、预测、建模和场景管理。可使用关系型数据库管理系统作为存储后端,也可使用自己的多维存储。
3. SQL的变化与扩展
3.1 SQL扩展
Oracle9i支持SQL:1999的主要特性,并提供了许多其他语言构造,包括一些特定于Oracle的语法和功能。
- connect by :一种树遍历方式,允许在单条SQL语句中进行类似传递闭包的计算。
- Upsert和多表插入 :Upsert操作结合了更新和插入,用于在数据仓库应用中合并新旧数据。多表插入允许基于一次数据探查更新多个表。
- with子句 :用于简化复杂查询。
3.2 面向对象的关系特性
Oracle对面向对象的关系构造提供了广泛支持。
| 特性 | 描述 |
|---|---|
| 对象类型 | 支持单一的类型继承模型 |
| 集合类型 | 支持可变长度数组(varrays)和嵌套表 |
| 对象表 | 用于存储对象,同时提供对象属性的关系视图 |
| 表函数 | 产生行集作为输出,可在查询的from子句中使用,且可嵌套 |
| 对象视图 | 提供存储在普通关系表中的数据的虚拟对象表视图 |
| 方法 | 可使用PL/SQL、Java或C编写 |
| 用户定义的聚合函数 | 可在SQL语句中像内置函数一样使用 |
| XML数据类型 | 用于存储和索引XML文档 |
3.3 触发器
Oracle提供多种类型的触发器,可使用PL/SQL、Java或C编写。
- 行级和语句级触发器 :对于LMD操作(如insert、update和delete),支持行级触发器(每行受影响时执行)和语句级触发器(每条语句执行一次),可定义为before或after触发器。
- instead of触发器 :用于无法直接进行LMD操作的视图,可手动指定对底层基表的操作,绕过视图LMD操作的限制。
- 其他事件触发器 :可在数据库启动或关闭、服务器错误消息、用户会话开始或结束以及LDD操作(如create、alter或drop)时执行。
4. 存储与索引
4.1 表空间
Oracle数据库由一个或多个逻辑存储单元(表空间)组成,每个表空间又由一个或多个物理结构(数据文件)组成。常见的表空间包括系统表空间、用户数据表空间和临时表空间。表空间还可用于在数据库之间迁移数据。
4.2 段
表空间的空间被划分为段,每个段包含特定数据结构的数据。段的类型包括数据段、索引段、临时段和回退段。
4.3 表
- 标准表 :以堆组织,行的存储位置不基于行中的值,插入时确定。支持嵌套表和临时表。
- 表分组 :不同表的行可根据公共列存储在同一块中,提高表连接性能,但可能增加单表查询的块访问数。还有关联分组方式,通过关联函数计算行的存储位置,可节省磁盘I/O,但需谨慎设置存储参数。
- 索引组织表 :记录存储在B树索引中,需要唯一键作为索引键。相比普通堆表和基于键列的索引,可提高性能和节省空间。但二级索引使用逻辑行标识符,可能导致访问速度变慢。
4.4 索引
- B树索引 :最常用的索引类型,可对一个或多个列创建。可选择压缩前缀以节省空间。
- 位图索引 :当索引列的不同值数量适中时,可节省大量空间和磁盘I/O。支持多个位图索引在同一查询路径中组合使用。
- 基于函数的索引 :可对包含一个或多个列的表达式创建索引,如upper(nombre),用于不区分大小写的查询。
- 连接索引 :主要用于星型模式,键列不在索引引用的表中。支持多列键,可与其他索引组合使用。
- 域索引 :允许使用非Oracle默认的索引结构,适用于特定应用领域,如文本、空间数据和图像。需在数据字典中注册,并与支持的操作符关联。
- 分区 :支持水平分区表和索引,提高数据库处理大规模数据的能力。包括范围分区、关联分区、复合分区和列表分区。
- 物化视图 :可存储SQL查询结果,用于加速查询处理。Oracle支持自动重写查询以利用物化视图,还提供完全更新和增量更新两种方式。
graph LR
A[表空间] --> B[数据段]
A --> C[索引段]
A --> D[临时段]
A --> E[回退段]
B --> F[标准表]
B --> G[嵌套表]
B --> H[临时表]
B --> I[索引组织表]
C --> J[B树索引]
C --> K[位图索引]
C --> L[基于函数的索引]
C --> M[连接索引]
C --> N[域索引]
F --> O[范围分区]
F --> P[关联分区]
F --> Q[复合分区]
F --> R[列表分区]
5. 查询处理与优化
5.1 执行方法
- 全表扫描 :查询处理器遍历整个表,从扩展映射中获取表的块信息并进行扫描。
- 索引扫描 :根据查询条件创建起始和/或结束键,用于扫描索引的相关部分。若需要的列不在索引中,还需通过行标识符访问表。
- 快速全索引扫描 :以与全表扫描类似的方式扫描索引扩展,若索引包含所有需要的列且无好的起始和结束键,这是最快的数据访问方式。
- 索引连接 :当查询只需要宽表的一小部分列,且没有一个索引包含所有这些列时,可通过连接多个索引生成相关信息,避免访问表。
- 分组和关联分组访问 :使用分组键访问数据。
5.2 优化
- 查询转换 :包括视图合并、复杂视图合并、平面子查询转换、物化视图重写和星型转换等。通过生成标准查询版本和经过高级转换的版本的成本估计,Oracle可智能选择最优方案。
- 访问路径选择 :基于成本的优化器确定连接顺序、连接方法和访问路径。考虑对象的统计信息,如大小、基数和列数据分布等。支持高度平衡直方图和频率直方图,可自动监控表的修改活动并更新统计信息。
- 分区修剪 :对于分区表,优化器会根据查询的where子句条件与表的分区标准匹配,避免访问不必要的分区。
- 并行执行 :允许在多处理器计算机上并行执行单个SQL语句,适用于计算密集型操作。根据操作类型,Oracle有多种工作划分方式,如水平分割数据、并行连接和并行排序等。并行执行由协调器和多个并行服务器进程组成,服务器进程采用生产者/消费者模型。
6. 并发控制与恢复
6.1 并发控制
Oracle的多版本并发控制机制与大多数数据库厂商不同。对于只读查询,提供一致的读快照,不使用读锁,读写操作互不阻塞,提高了并发度。支持语句级和事务级的读一致性,通过系统更改号(SCN)确定查询的时间点。若数据块的SCN大于查询关联的SCN,则从回退段中获取旧版本数据。
6.2 恢复结构
包括数据文件、控制文件、重做日志文件、归档重做日志文件和回退段。重做日志记录数据库的事务修改,可在归档模式下由后台进程归档。回退段包含数据的旧版本信息,用于撤销事务和恢复一致的数据视图。
6.3 恢复过程
定期备份数据文件和控制文件,恢复时先应用归档的重做日志文件重做事务,再使用回退段撤销未提交的事务,使数据库达到一致状态。支持热备份和并行恢复,还提供管理工具自动化备份和恢复任务。
6.4 备用数据库管理
备用数据库是主数据库的副本,安装在单独的系统中。若主系统发生灾难性故障,备用系统可激活并接管控制,将故障对可用性的影响降至最低。Oracle通过不断应用主数据库发送的归档重做日志文件来保持备用数据库的更新,备用数据库可在线以只读模式使用。
6.5 隔离级别
支持ANSI/ISO的“读提交”和“可串行化”两个隔离级别,无脏读支持。两个级别分别对应语句级和事务级的读一致性,可在会话或事务级别设置,默认是语句级读一致性。使用行级锁,不同行的更新不冲突,若两个写入者尝试修改同一行,一个会等待另一个提交或回滚。还支持自动检测和解决死锁,以及自主事务。
graph LR
A[查询开始] --> B[确定SCN]
B --> C{数据块SCN > 查询SCN?}
C -- 是 --> D[从回退段获取旧版本数据]
C -- 否 --> E[使用当前数据]
D --> F[返回查询结果]
E --> F
7. 系统架构
7.1 专用服务器:内存结构
Oracle使用的内存主要分为三类:软件代码区域、系统全局区域(System Global Area, SGA)和程序全局区域(Program Global Area, PGA)。
-
软件代码区域
:存放Oracle服务器的代码。
-
PGA
:为每个进程分配,用于存放本地数据和控制信息,包括会话数据的栈空间、正在执行的SQL语句的私有内存,以及排序和关联操作的内存。
-
SGA
:是用户共享的内存区域,包含以下主要结构:
-
中间内存缓存
:将频繁访问的数据块(表和索引)保存在内存中,减少物理磁盘I/O。除全表扫描期间访问的块外,采用较旧的策略。允许创建多个具有不同数据时效性标准的中间内存队列。部分Oracle操作可绕过此缓存直接从磁盘读取数据。
-
重做日志中间内存
:包含尚未写入磁盘的重做日志部分。
-
共享队列
:旨在通过最小化每个用户所需的内存量,最大化并发使用数据库的用户数量。多个用户执行相同的SQL语句时,可共享表示该语句执行计划的大部分数据结构,仅特定调用的本地数据需保存在私有内存中。SQL语句可共享的部分存储在共享队列中,包括语句文本。缓存的SQL语句在编译时也会保存,新调用已缓存的语句无需完整的编译过程。通过精确匹配文本和设置特定会话参数来确定SQL语句是否相同,Oracle还可自动将SQL语句中的常量替换为绑定变量,使除常量值外相同的查询能与共享队列中的前一个查询匹配。共享队列还包含字典信息缓存和各种控制结构。
7.2 专用服务器:进程结构
执行Oracle服务器代码的进程有两种类型:处理SQL语句的服务器进程和执行与性能相关的各种管理任务的后台进程。部分后台进程是可选的,某些情况下为提高性能可使用多个相同类型的进程。主要的后台进程包括:
| 进程名称 | 功能 |
| — | — |
| 数据库写入器 | 当中间内存缓存中的数据块被移除时,若自其进入缓存后已被修改,则将其写回磁盘,释放中间内存缓存空间,有助于提高系统性能。 |
| 重做日志写入器 | 处理重做日志中间内存的写入操作,将其写入磁盘上的重做日志文件。事务提交时,还会将提交记录写入磁盘。 |
| 检查点进程 | 发生检查点时,更新数据文件的头部。 |
| 系统监视器 | 在必要时进行崩溃恢复,还执行一些空间管理操作,回收临时空间中未使用的空间。 |
| 进程监视器 | 对失败的服务器进程进行恢复,释放资源并执行各种清理操作。 |
| 恢复器 | 解决故障并指导分布式事务的清理工作。 |
| 归档器 | 每当在线重做日志文件填满时,将其复制到归档重做日志中。 |
7.3 多线程服务器
多线程服务器配置通过在多个SQL语句之间共享服务器进程,增加了给定数量的服务器进程所能支持的用户数量。与专用服务器架构的主要区别如下:
- 后台发送进程将用户请求路由到下一个可用的服务器进程。它使用SGA中的请求队列和响应队列,将新请求放入请求队列,由服务器进程获取。服务器进程完成请求后,将结果放入响应队列,由发送进程取回并返回给用户。
- 由于服务器进程在多个SQL语句之间共享,Oracle不在PGA中维护私有数据,而是将特定于会话的数据存储在SGA中。
7.4 Oracle9i实时应用集群
Oracle9i实时应用集群允许多个Oracle实例在同一数据库上运行,使Oracle能在集群硬件架构和MPP(无共享)系统上运行。该特性具有重要的可扩展性和可用性优势,适用于OLTP和数据仓库环境。
-
可扩展性
:更多的节点意味着更强的处理能力,Oracle通过亲和性连接和分区连接等特性进一步优化硬件使用。
-
可用性
:若某个节点发生故障,其余节点仍可使应用程序访问数据库。剩余实例会自动回滚故障节点中未提交的事务,避免其他节点的活动被阻塞。
-
技术挑战与解决方案
:多个实例在同一数据库上运行会带来一些技术问题,如锁管理和缓存管理。为解决这些问题,Oracle支持分布式锁管理器和缓存合并特性,允许数据块通过互连直接在不同实例的缓存之间流动,而无需写入磁盘。
graph LR
A[用户请求] --> B[后台发送进程]
B --> C[请求队列]
C --> D[服务器进程]
D --> E[响应队列]
E --> B
B --> F[返回用户]
8. 复制、分布式处理与外部数据源
8.1 复制
Oracle支持多种类型的复制:
-
快照复制
:最简单的形式是将主站点的数据以快照形式复制到其他站点。快照可以不包含主数据的所有内容,例如出于安全原因排除表的某些列。支持只读和可更新两种快照。可更新快照可在从站点进行修改,并将修改传播到主表;只读快照允许更广泛的定义,例如基于主站点表上的一组操作进行定义。还支持多个主站点,所有主站点作为对等体,一个主站点上的表更新会传播到其他主站点。更新可以异步或同步传播。
-
异步复制
:更新信息通过批处理进程发送到其他主站点并应用。由于同一数据可能在不同站点发生冲突修改,可能需要基于业务规则解决冲突,Oracle提供了一系列内置的冲突解决方法,也允许用户自定义。
-
同步复制
:主站点的更新立即传播到其他站点。若任何主站点的更新事务失败,则所有站点的更新都会被撤销。
8.2 分布式数据库
Oracle支持对不同系统上的多个数据库进行查询和事务处理。通过使用网关,远程系统可以包括非Oracle数据库。Oracle具有内置的优化能力,可优化包含不同站点表的查询,检索相关数据并将结果作为普通本地查询返回。还支持通过内置的两阶段提交协议透明地向多个站点发出事务。
8.3 外部数据源
Oracle有多种机制支持外部数据源,常见于数据仓库从事务系统加载大量数据的场景。
-
SQL*Loader
:直接加载实用程序,支持从外部文件快速并行加载大量数据,支持多种数据格式,并可对加载的数据执行多种过滤操作。
-
外部表
:允许在查询的from子句中像引用普通表一样引用外部数据源,如平面文件。通过元数据定义外部表,描述Oracle列类型以及外部数据与这些列的对应关系,还需要一个访问驱动程序来访问外部数据,Oracle为平面文件提供了默认驱动程序。该特性主要用于数据仓库的提取、转换和加载(ETL)操作,可在SQL语句中通过select列表或where子句对数据进行聚合、转换和过滤操作。为实现可扩展性,可利用Oracle的并行执行特性并行访问外部表。
9. 数据库管理工具
9.1 Oracle企业管理器
Oracle企业管理器是Oracle用于数据库系统管理的主要特性,提供了易于使用的图形用户界面(GUI)和一系列用于模式管理、安全管理、实例管理、存储管理和任务规划的向导。还提供性能监控和工具,帮助管理员调整应用程序SQL、访问路径和实例及数据的存储参数。例如,包含一个向导,可根据给定的工作负载建议最有效的索引创建方案。
9.2 数据库资源管理
数据库管理员需要控制处理能力在用户和用户组之间的分配。不同用户组可能有不同的需求,如交互式查询用户对响应时间要求较高,而长报表用户可在系统负载较低时以批处理方式运行。同时,需要避免用户无意中发送极其昂贵的临时查询,影响其他用户。Oracle的数据库资源管理特性允许管理员将用户划分为具有不同优先级和属性的资源消费组。
-
资源分配
:例如,高优先级的交互式用户组可保证至少获得60%的CPU资源,剩余资源以及高优先级组未使用的部分60%资源将分配给低优先级的资源消费组。极低优先级的组可能分配0%的资源,这意味着该组发送的查询仅在有未使用的CPU周期时执行。
-
并行度限制
:可为每个组设置并行执行的并行度限制。
-
执行时间限制
:管理员还可设置SQL语句的最大执行时间限制。当用户发送语句时,资源管理器会估计执行时间,若超过限制则返回错误。
-
会话数量限制
:资源管理器还可限制每个资源消费组同时激活的用户会话数量。
通过以上对Oracle数据库各个方面的深入了解,我们可以看到Oracle在功能的丰富性、架构的灵活性和管理的便捷性上都有出色的表现,能够满足不同规模和需求的企业在数据管理和处理方面的要求。
超级会员免费看
2216

被折叠的 条评论
为什么被折叠?



