Oracle 和 DB2,比较与兼容性/架构/概述
一般来说,关系型数据库(DBMS)看起来像这样
数据库包含的实际数据驻留在物理介质上 - 磁盘驱动器。当需要数据时,它会被移动到共享内存 - RAM。当需要对这些数据执行工作时,它由操作系统处理 - 进程和线程。
由于磁盘上只发生读取和写入操作,因此磁盘上的数据受介质限制,但以一种利用磁盘存储优点(位、字节、块、磁道和柱面)的方式进行组织。这种物理组织由操作系统管理,对数据库用户来说完全是不可见的。数据库管理员(DBA)可以指定将数据库的不同部分放在不同的磁盘上,以及可以复制这些数据,但在最低级别上,您通常不关心数据是如何进出磁盘或如何组织的。磁盘数据的组织针对读取和写入进行了优化。话虽如此,但构成数据库结构的各种不同数据集 - 我们认为是包含行和列的表的数据本身、这些数据的索引、日志文件、控制文件、参数文件、配置文件和应用程序逻辑。至关重要的是,DBMS 知道这种结构,而 DBMS “看到” 它的方式是通过存储模型。存储模型是一个抽象层,它将简单读取和写入数据的需求映射到 DBMS 的需求。虽然您不关心数据是如何读取和写入的,但您确实关心对用户数据的更改不会写入配置文件,例如。因此,每个 DBMS 都有一个关于磁盘上不同类型数据的表示,它需要执行其工作。DBMS 的存储模型描述了 DBMS 的物理结构(控制文件、数据文件、日志文件),这种结构被称为数据库。磁盘数据具有以下优点。它便宜,它实际上是无限的,最重要的是它是持久性的。
对数据进行工作的场所是在内存中。内存访问速度比磁盘快几个数量级,并且在内存中可以构建的结构类型比磁盘上的结构类型限制更少 - 它们可以很复杂并且是任意的,并且可以轻松地修改和重组。这赋予了 DBMS 速度和灵活性。内存和磁盘之间存在一个共同的结构,这个基本的信息构建块恰如其分地被称为块。内存中的结构按块组织,这便于将磁盘上的块读入内存。由于数据库中的数据块在逻辑上是相关的,因此不仅移动您需要的数据到内存,而且移动您可能在同一时间需要的数据是有效的。这些“预期”读取称为预取,由于它们可以一次获取多个数据块,因此这些块在称为范围的结构中相互堆叠。除了保存从磁盘检索的数据外,内存还将保存数据库操作期间创建的瞬态结构(即中间排序表)、可执行代码块、系统目录和字典以及计划。内存模型描述的内存结构可以快速访问,并且包含 DBMS 操作所需的大部分信息。这包括存储在磁盘上的更大用户数据部分,以及数据库管理系统本身所需的结构(即计划、元代码等)。由于可能无法或不希望将驻留在磁盘上的所有数据都放在内存中,并且出于安全性(持久性)原因,DBMS 将在内存和磁盘之间交换数据。
DBMS 中同时发生很多事情,例如从磁盘读取和写入数据、在数据库日志中记录恢复信息、检查内存中的数据是否已更改、保存用户和系统程序的连接、监控数据库的运行状况、运行用户编写的代码、锁定数据库的某些部分并检测死锁。这个列表绝不是详尽无遗的,并且不同 DBMS 实现之间存在差异。
这些差异将在后面针对每个适当的数据库进行介绍,但有一组核心进程处理内存管理、分页到磁盘以及在恢复或回滚事件中写入信息。正是这些与内存中的结构协同工作被称为实例。
进程模型实现
数据库需要能够为来自并发用户的众多请求提供服务。它们运行的操作系统使用进程和线程处理并发。线程是操作系统可以调度的最小执行单元,通常一个进程包含一个或多个线程。进程中的多个线程可以访问相同的资源,例如内存,而包含它们的进程则不能。这在速度上具有优势,因为线程可以在没有进程间调用 (IPC) 开销的情况下相互通信。缺点是,由于线程可能会相互践踏,因此它们正在处理的结构需要被锁定,而这些锁需要管理(这会带来自身的开销)。即使有了这些机制,线程在处理相同数据结构时仍然有可能更改数据,然后另一个线程将其更改回来 - 这就是所谓的“竞争条件”。这些问题极其难以隔离和重现。话虽如此,线程的实现方式因操作系统而异,有些操作系统在这方面做得比其他操作系统好。
在单处理器系统上,线程通过多路复用处理。这是处理器在线程之间切换(称为上下文切换)的地方,当处理器正在处理执行线程时,其他线程会等待。通常情况下,处理器的运行速度远快于各个线程的需求(这些线程可能正在等待 I/O 或用户输入),并且切换速度如此之快,以至于看起来每个线程都在同时运行。在多处理器系统上,线程通常会同时在不同的处理器上运行。
数据库将映射其并发用户需求到底层操作系统的进程和线程。这种映射称为数据库进程模型。由于数据库的使用方式不同(单用户与多用户、独立与并行),以及不同操作系统对线程的实现方式不同,因此 Oracle 和 DB2 允许用户实现不同的进程模型。这是一个实现级别的决定;一旦数据库安装好,您选择的进程模型就固定了。Oracle 和 DB2 将根据您的需求和操作系统指导您做出最合适的选择。需要执行的工作单元是相同的,无论它们是作为线程还是进程实现的,并且令人困惑的是,术语进程模型和进程倾向于用于线程、用户进程、数据库进程和操作系统进程可互换(就像数据库可以表示数据库实例或磁盘上的用户数据一样),本书也不例外。当使用“进程”一词时,它表示所有三种(数据库进程、操作系统进程和用户进程)以及线程正在完成的工作。当我们想要描述数据库需要执行的工作单元时,这是一个方便使用的术语,而底层实现不是一个考虑因素(抽象,如果你愿意)。在必须区分进程类型和进程与线程的地方,这种差异将是具体的(即,检查点是一个进程与检查点是一个带线程的数据库进程)。虽然这可能看起来有点迂腐,但这是一个重要的区别,因为在实现数据库兼容性时需要考虑这一点。
Oracle 和 DB2 默认情况下都通过进程支持每个并发用户。
对于具有大量并发用户的系统,Oracle 建议将用户多路复用到进程池中。如果操作系统具有良好的线程实现,DB2 将为每个用户使用这些操作系统线程。
磁盘上的结构构成数据库,内存中的结构和进程构成数据库实例,数据库实例和数据库一起被称为数据库服务器。