分类:html
系统结构概述算法
首先,咱们须要理解 Oracle 使用的架构,并理解它与 DB2 的不一样之处。图 1 展现了 Oracle 的系统结构。将该图与 图 2 进行比较,后者显示了 DB2 的系统结构。在阅读本文的时候,为便于理解,能够参照这两个图。sql
![]() ![]() |
![]()
|
实例数据库
在 Oracle 和 DB2 中,实例 的概念是相似的。在这二者之中,实例都是指后台进程与共享内存的组合。二者之间的主要差异在于,在 Oracle 中每一个实例只能有一个数据库,而在 DB2 中多个数据库能够共享一个实例。数组
在 Oracle 中,因为数据库与实例是一对一的关系,所以用 CREATE DATABASE 命令建立一个数据库的同时便隐式地建立了一个实例。或者,为了在计算机上建立一个 Oracle 实例,也可使用 Database Configuration Assistant,或者使用 ORADIM 实用程序,后者是 Oracle 9i 经过 NEW 选项提供的。另外还必须提供某些信息,包括系统标识符(System Identifier,SID)或一个服务名称、实例密码、最大用户数、启动模式等等。相似地,为了删除实例,可使用 ORADIM 实用程序加 DELETE 选项。这里须要提供 SID 或服务名称。除非在安装过程当中建立一个新的数据库,不然在以 fresh 方式安装 Oracle 的时候,不会建立缺省的实例。缓存
在 DB2 中,当在 Windows 平台上安装了该产品以后,便缺省地建立了一个实例 "DB2"。在 Linux 和 UNIX 中,缺省的实例名称为 "db2inst1"。若要在同一台计算机上建立另外一个实例,只需执行命令 de>db2icrt <instance name>de>。安全
图 3 展现了缺省的 DB2 实例 “DB2”(在 Windows 中)和从 DB2 Control Center GUI 中用 db2icrt 命令建立的另外两个实例。服务器
若要在命令行接口中引用给定的 DB2 实例,可使用环境变量 DB2INSTANCE。经过这个变量,能够指定当前活动实例,全部命令将应用到此实例。例如,若是 DB2INSTANCE 被设置为 PROD,而后您执行了命令 de>create database MYDB1de>, 将建立一个与实例 PROD 关联的数据库。若是要在实例 DB2 上建立该数据库,那么必须首先将 DB2INSTANCE 变量的值改成 DB2。这相似于 ORACLE_SID (System Identifier),当用户想要在不一样实例之间进行切换时,也是使用 ORACLE_SID。网络
还有一种标识要使用的实例的简单方法,那就是使用 DB2 Control Center GUI,如 图 3 所示。要在该工具中看到对应于新实例的条目,须要经过右击 Instances 并选择 Add 来将该实例添加到此工具中。要删除 DB2 中的一个实例,能够执行命令 de>db2idrop <instance name>de>。架构
总 之,在 Oracle 中,可使用 Database Configuration Assistant 来建立、修改、启动、中止和删除实例,而在 DB2 中则可使用 Control Center GUI 作一样的事情。并且,Oracle 实例与数据库只能是一对一的关系,而在 DB2 中却不是这样。一个 DB2 实例中能够同时存在多个数据库,而且能够并发地使用这些数据库。
![]() ![]() |
![]()
|
在 Oracle 中,能够用 CREATE DATABASE 命令手动建立数据库,也能够用 Database Configuration Assistant 建立数据库。手动建立数据库时,在执行 CREATE DATABASE 命令以前,须要执行一系列的步骤,包括设置 OS 变量,准备参数文件,以及建立密码文件。
元数据信息在 Data Dictionary 中存储和管理,由基本表和相应的视图组成。基本表是在数据库建立过程当中自动建立的,而视图则是经过运行 catalog.sql 和 catproc.sql 脚本构造的。
所以,Oracle 数据库可看做包含 3 种类型的文件的一个集合:
在 DB2 中,一个实例能够包含多个数据库,如 图 2 所示。每一个数据库都是一个封闭的、真正独立的单元。每一个数据库有其本身的编目表空间、临时表空间和用户表空间,这些表空间是在建立数据库时缺省建立的。DB2 包含一个称为系统数据库目录(system database directory) 的二进制文件,其中包含可从 DB2 机器上链接的全部数据库的条目。这个目录保存在实例级。
当建立一个实例时,缺省状况下不会建立数据库,您须要使用 create database 命令显式地建立一个数据库。此外还能够用 Control Center 建立数据库,如 图 4 和 图 5 所示。
在 图 5 中,您也能够看看单击 Show Command 时会出现什么状况。全部的 DB2 Control Center GUI 屏幕都会显示实际上在后台执行的 SQL 语句或命令。这些命 令能够保存在一个脚本中,以便在之后执行,或者也能够将它们复制到 Command Line Processor(CLP)或 Command Center GUI 工具中,在这些工具中执行。这些工具分别至关于 Oracle 的 SQL*Plus 和 iSQL *Plus。
可使用 'DROP DATABASE' 命令或者在 DB2 Control Center GUI 中删除一个 DB2 数据库。而在 Oracle 中却不是使用这样的命令。数据库的删除是经过删除全部相关数据文件来完成的。
同一个实例中的数据库一般不会相互进行交互。然而,若是应用程序须要与多个数据库交互,那么经过启用联邦(federation) 支持能够知足这一需求。在 参考资料 小节中有一篇关于联邦的文章。
![]() ![]() |
![]()
|
在 Oracle 中,在物理上数据是存储在被称做数据文件(Data File)的文件中的。这相似于 DB2 的容器(container),DB2 的容器也是数据实际存储的地方。每一个 Oracle 数据库包含一个名为 SYSTEM 的表空间,这是在建立数据库时由 Oracle 自动建立的。其余用于用户数据、临时数据和索引数据的表空间则须要在建立数据库以后另行建立,而且在使用这些表空间以前,还须要为之指定一个用户。
在 DB2 中,表空间 是逻辑对象,做为逻辑表和物理容器之间的一层。当建立一个表空间时,能够将它与一个特定的缓冲池(数据库缓存)关联起来,并关联到特定的容器。这为性能管 理带来了灵活性。例如,若是有一个 "hot" 表,那么能够在一个单独的表空间中定义它,而这个表空间又与一个独立的缓冲池相关联。这有助于确保此表中的数据连续地缓存在内存中。
在 DB2 中,使用 CREATE DATABASE 命令及其缺省值建立数据库时,同时也会自动建立三个缺省的表空间。表 1 描述了缺省的 DB2 表空间:
表 1. 用缺省值建立数据库时,缺省建立的 DB2 表空间表空间名称 | 描述 |
SYSCATSPACE | 包含元数据的编目表空间 |
TEMPSPACE1 | 用于执行链接和排序等操做的系统临时表空间。这个表空间的名称能够更改 |
USERSPACE1 | 这个表空间是可选的,若是在建立表的时候没有显式地指定表空间,那么能够用这个表空间来存储用户表 |
在 DB2 中,因为数据库是独立的单元,所以表空间不能跨数据库共享。因为表空间只在一个数据库中是可知的,所以两个不一样的数据库能够有具备相同名称的表空间。在 图 2 中能够看到这一点,其中数据库 MYDB1 有一个名为 MYTBLS 的表空间,而数据库 MYDB2 也有一个同名的表空间。
DB2 表空间能够分为 SMS(系统管理的表空间)与 DMS(数据库管理的表空间)两类。SMS 表空间由操做系统管理,它们只能是目录。SMS 表空间可根据须要自动增加,所以 SMS 能够提供很好的性能,而且须要的管理也不多。DMS 表空间由 DB2 管理,既能够是文件,也能够是原始设备。这种类型的表空间能够提供最佳性能,可是须要进行一些管理。例如,须要预先指定想要为这个表空间分配多大的空间, 由于这种表空间不能自动增加。
Oracle 的存储模型中没有 SMS 的概念,可是它的数据文件相似于 DB2 DMS 表空间。也就是说,能够经过增长数据文件的大小,或为表空间添加数据文件,或者经过添加一个新的表空间,来增长数据库的大小。
表 2 显示了 Oracle 数据库或表空间与 DB2 数据库或表空间的对应关系。
表 2. Oracle 数据库与 DB2 数据库和表空间的对应关系Oracle 数据库或表空间 | DB2 数据库或表空间 |
SYSTEM 是存放编目(数据字典)信息的表空间 | SYSCATSPACE(编目表空间);和在 Oracle 中同样,仅在数据库级保存该信息 |
Data Dictionary(包含表和视图形式的元数据),驻留在 SYSTEM 表空间中 | 系统编目表(由 SYSIBM 模式标识),系统视图(由 SYSCAT 或 SYSSTAT 模式标识),驻留在 SYSCATSPACE 表空间中 |
SCOTT 数据库 | SAMPLE 数据库 |
TEMP 表空间 | System Temporary 表空间(缺省状况下名为 tempspace1) |
UNDO 表空间 | N/A |
USER 表空间 | 用户表空间。缺省状况下,USERSPACE1 通常是在数据库建立以后才建立的 |
前面已指出,Oracle 的数据缓冲区概念至关于 DB2 的缓冲池。可是,DB2 容许多个缓冲池存在。在 DB2 中不须要预先定义可建立的缓冲池的数量,缓冲池的名称能够是任意的。
Oracle 中块(block) 的概念与 DB2 中的页最为类似。一个 DB2 页的大小能够为 4k、8k、16k 或 32k。表中的一个行只能放在一个页中,而不能像 Oracle 中那样跨多个页。
![]() ![]() |
![]()
|
Oracle 中的对象名称形式以下:
de>[Schema_name.]object_name[@database]de>
在 DB2 中,对象名称也是由两部分组成的结构:
de>Schema_name.object_namede>
和 在 Oracle 中同样,DB2 模式名称用于在逻辑上组织对象。可是二者之间一个重要差别是,在 DB2 中,模式名称不必定与一个用户 id 相匹配。任何拥有 IMPLICIT_SCHEMA 权限的用户均可以用一个不存在的模式建立对象。例如,假设 “Peter” 具备 IMPLICIT_SCHEMA 权限,他执行如下命令:
de>CREATE TABLE WORLD.TABLEA (lastname char(10))de>
该命令建立表 WORLD.TABLEA,其中 WORLD 是新建立的模式。若是 Peter 没有显式地指定模式,那么该命令就会建立表 PETER.TABLEA,由于缺省状况下是使用链接 ID。
在 DB2 中,在发出与数据库相关的命令以前,老是要链接到数据库。所以,在这种架构下,对象名称不须要包括数据库名称。
![]() ![]() |
![]()
|
在 Oracle 和 DB2 中,表、视图和索引基本上是同样的。
DB2 提供了一个名为 Design Advisor 的实用程序,能够用它来为特定的查询或工做负载推荐索引。Design Advisor 能够从 DB2 Control Center 中调用,也能够从 DB2 CLP 中使用 db2advis 命令来调用。在 DB2 中,索引是直接与表定义绑定的。例如,当使用 DMS 表空间时,能够用下面的语句指定索引存放在哪一个表空间:
de>CREATE TABLE mytable (col1 integer, col2 char(10)) in tbls1 index in tbls2de>
上面的例子代表,表中的数据将存储在表空间 'tbls1' 中,而索引页将存储在表空间 'tbls2' 中。但在 Oracle 语法中,CREATE INDEX 语句有一个选项来指定索引存放在哪一个表空间。
此外,在 DB2 中,索引一旦建立好,便不能修改索引定义中的任何子句。为了进行更改,须要删除索引,而后从新建立索引。
和在 Oracle 中同样,不一样数据库中的 DB2 表、视图和索引能够有相同的名称。相同数据库中的表和视图则必须使用不一样的名称,可是容许使用与已有的表或视图相同的名称建立索引。
![]() ![]() |
![]()
|
在 Oracle 环境中,有不少方法来建立和访问存储过程、触发器和函数。PL/SQL 是 SQL 的面向对象(OO)过程扩展,支持数据操纵(DML)、流控制、变量和常量的声明、过程和函数定义以及 OO 数据类型,例如嵌套表和变长数组(varray)。Oracle 还将 JVM 并入到它的引擎中。在 Oracle 数据库中,可使用 SQLJ 将存储过程、函数和触发器,做为类来建立、存储和执行。Oracle 还支持 Type 1 至 4 的 JDBC 驱动程序。
DB2 存储过程能够用 DB2 预编译器支持的任何语言编写,包括 Java、C、C++、REXX、Fortran 和 COBOL。可是,咱们推荐您使用 SQL Procedural Language(SQL PL),这种语言很是相似于 Oracle 的 PL/SQL。在开发 SQL PL 存储过程时,须要一个 C 编译器,由于这种存储过程首先要转换成 C。存储过程的 C 实现能够提供性能优点,由于代码只需编译一次(在 unfenced 模式下性能优势尤为明显)。可是,在开发这种存储过程时,开发系统上须要一个额外的 C 编译器。在 DB2 未来的版本中,有望出现不需 C 编译器支持的 SQL PL 存储过程。DB2 存储过程开发还利用 Type 1 至 4 的 JDBC 驱动程序来支持 SQLJ 和 Java。
触发器和函数的开发可使用内联 SQL/PL,这种方法不须要 C 编译器。这种方法支持 SQL PL 语句的一个子集。另外还可使用 DB2 Development Center Tool 来简化 DB2 存储过程和用户定义函数的建立、构建、调试和部署。
![]() ![]() |
![]()
|
传 统上,Oracle 将全部与会话和系统相关的参数存储在一个文本文件中,这种文件一般被称作 initSID.ora。可是,因为这种文本文件不具备持久性,从 Oracle 9i 开始,Oracle 引入了 Server Parameter File(SPFILE),这是一种存储在服务器上的二进制参数文件。它在实例中止以后到启动以前这个过程当中是持久存在的。不过,当 SPFILE 不可用的时候,仍然使用 initSID.ora 文件。引入 SPFILE 以前,任何对参数有影响的 ALTER SYSTEM 和 ALTER SESSION 命令都只能在实例或会话活动期间持久。每当数据库实例须要回弹(rebound)时,DBA 都必须手动修改 initSID.ora 文本文件。对于侦听器,网络访问配置一般存储在 listener.ora 中;对于客户机访问,网络访问配置一般存储在 tnsnames.ora 中。
在 DB2 中,配置参数也是存储在实例级和数据库级,在实例级是数据库管理器(database manager) 配置文件,在数据库级是数据库配置文件。这些参数大多数均可以动态地更改,也就是说,不须要为了使对参数值的更改生效而中止并重启实例或者重连全部链接。
若是想在 CLP 中手动更改特定的数据库管理器配置参数,可使用命令 de>UPDATE DBM CFG USING <parameter name> <new value>de>。
若是想在 CLP 中手动更改特定的数据库参数,可使用命令 de>UPDATE DB CFG FOR <database name> USING <parameter name> <new value>de>。
这两个命令分别至关于 Oracle 的 ALTER SYSTEM 和 ALTER SESSION。或者,也可使用 Control Center 查看和修改这些参数的值。若是右键单击一个给定的实例,并选择 Configure Parameters,那么能够看到 图 6 中显示的窗口。
在数据库级,右击一个给定的数据库,并选择 Configure Parameters,则能够看到 图 7 中显示的窗口。
DB2 提供了不少用于配置系统的参数。可是,若是想经过一种容易的方法自动配置系统,那么可使用 de>autoconfigurede> 命令(或者 Configuration Advisor GUI),它会根据您提供的一些信息将数据库管理器配置参数和数据库配置参数设置成最佳值。图 8 显示了 Configuration Advisor。
除了配置文件外,DB2 一般还为与平台相关的配置使用 DB2 注册表变量。注意,DB2 注册表变量与 Windows 注册表没有任何关系。可使用命令 db2set 查看和更改这些变量。
链接(网络访问)信息存储在 System 数据库目录、本地数据库目录和节点目录中。这些都是二进制文件,只能用 CATALOG 和 UNCATALOG 命令修改。
![]() ![]() |
![]()
|
接下来,咱们来看看内存架构和后台进程,而且比较一下 Oracle 和 DB2 中内存架构和后台进程的不一样之处。
Oracle 中的 System Global Area(SGA)是一组共享内存块,用于存储与实例有关的信息。其中包括语句缓存、重作日志缓冲区和数据缓冲区缓存。Program Global Area(PGA)和 User Global Area(UGA)共享内存块,包含用于服务器进程和用户会话的数据和控制信息。
Oracle 支持在同一台计算机上存在多个实例,但不容许共享后台进程。例如,同一台计算机上的三个实例就须要三组后台进程。所以建议在一台计算机上包含一个数据库、一个实例和多个模式。
DB2 和 Oracle 都使用共享内存块,可是 DB2 与 Oracle 内存架构的实现方式略有不一样。因为 DB2 实例能够包含多个数据库,所以存在两个级别的配置。在前一节已经提到,实例级的配置能够在 DBM CFG 文件中完成,而数据库级的配置则能够在 DB CFG 文件中完成。这两个级别上的配置参数均可以进行调整,以调优内存使用状况。后文将更详细地阐述 DB2 的内存结构和不一样的后台进程。
Oracle 是在实例和数据库启动时将内存分配给它们的,而 DB2 则是在不一样级别上分配内存。这主要是由于 DB2 实例能够包含多个数据库。DB2 中主要有三种内存结构:
在 DB2 for Windows 中,服务器活动是以线程的形式进行的,而在 Linux 和 UNIX 环境中,这些活动是之后台进程的形式来实现的。DB2 有如下几种级别的进程:
要得到对 DB2 进程的完整解释,请参考文章 “DB2 通用数据库进程全接触”。
![]() ![]() |
![]()
|
Oracle 中的锁能够是手动的,也能够是自动的。Oracle Lock Manager 能够在行级隐式地锁定表数据,此外也可使用如下 SQL 语句在事务或会话级覆盖缺省的锁:
de>1. SET TRANSACTION ISOLATION LEVELde>
de>2. LOCK TABLEde>
de>3. SELECT FOR UPDATEde>
Oracle 支持一种称为 Multi-Version Read Consistency 的机制,这是用 undo 段中的 undo 数据实现的。
DB2 实现 ANSI 标准隔离(Isolation)级别,例如未提交读(Uncommitted Read)、游标稳定性(Cursor stability)、读稳定性(Read stability)和可重复读(Repeatable Read)。除非使用未提交读隔离级别,不然用户只能看到已提交的数据。行锁是根据隔离级别隐式地得到的。可锁定的数据库对象有表空间、表和行,可是,只 有表和表空间能够显式锁定。可以使用 de>LOCK TABLEde> 命令来锁定一个表,而不是使用缺省的行锁定。
与 Oracle 不一样,在 DB2 中,锁是存储在内存中的,而不是存储在数据页中。可使用 LOCKLIST 数据库配置参数来配置锁可用的内存,而 MAXLOCKS 配置参数则定义用于一个特定应用程序的锁的最大内存。
![]() ![]() |
![]()
|
Oracle 和 DB2 都是具备基本的和高级的安全特性的安全数据库。Oracle 中有 4 种不一样的用户身份验证方法:
身份验证方法是在使用 de>CREATE USERde> 命令建立用户时指定的。Oracle 中有一些 Data Dictionary 视图,其中包含了关于这些用户的信息。
在 DB2 中,用户不是存在于数据库中,而是由操做系统来管理。没有数据库登陆信息存放在数据库表中。任何操做系统用户都有可能访问 DB2;可是,除非他们被授予了给定的 DB2 权限或特权,不然他们能作的事情很少。经过 Control Center GUI 很容易授予和撤销权限和特权。不过首先须要将可用操做系统用户或组中的一个用户或组添加到 Control Center。
在 DB2 中没有 “角色(role)” 这个术语。相反,DB2 使用术语 “权限(authority)”,它相似于 Oracle 的数据库角色,DB2 经过权限将特权授予某些组或用户。DB2 支持的权限有:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。
不能使用 GRANT SQL 语句授予 SYSADM、SYSCTRL 和 SYSMAINT 权限。这些特殊的权限只能在数据库管理器配置文件中设置。
DB2 还使用术语 “特权(privilege)”,它相似于 Oracle 的系统和模式对象特权。DB2 中有数据库特权(链接、建立表等)和数据库对象特权(模式、表、视图等)。图 11 显示了从 Control Center GUI 得到的 DB2 安全性信息。Change User 窗口中显示的大部分选项卡对应了 DB2 所支持的特权。
Oracle 10g 的安全性大致上没有变化,只有部分加强。下面是 Oracle 10g 中的加强的列表:
DB2 中的身份验证不只涉及对用户名和密码进行加密,还容许对客户机与服务器之间传输的数据进行加密。身份验证的位置由数据库管理器配置参数 AUTHENTICATION 的值决定。
下面是用于启用 DB2 的身份验证的有效选项:
若要更新 AUTHENTICATION 实例参数,例如将它的值设置为 DATA_ENCRYPT,可使用如下命令:
|
DB2 提供了基于标签的访问控制(Label Based Access Control,LBAC)机制,从而进一步扩展了安全性。 LBAC 特性为控制对各行和各列的读写访问提供了更大的粒度。 DB2 中提供了一种新的安全管理员角色(SECADM),用于操纵 LBAC 对象。
试图访问一个对象的用户必须被授予该对象的安全标签。若是安全标签匹配,则容许访问;若是不匹配,则拒绝访问。 实现 DB2 中的 LBAC 安全性基本上有三个步骤:
除了特权和权限外,数据库安全性还包含其余方面。简单地说,Oracle 与 DB2 之间既有不一样点,也有相同点:
用户身份验证和受权
Oracle 在建立用户以后,使用存储在目录中的加密密码。DB2 支持用于用户身份验证的密码,并使用底层的操做用户进行身份验证。Oracle 和 DB2 都支持 LDAP (Oracle Internet Directory 与 IBM Directory Server)。Oracle 和 DB2 都支持单点登陆(SSO)。
数据加密
Oracle 支持数据加密,它能够对敏感数据,例如信用卡号和一些高度敏感的商业数据进行加密。DB2 容许列级的数据加密。
网络加密
Oracle 经过它的 Oracle Advanced Security 提供网络加密。Oracle 使用 DES、3DES 和 RC4 业界标准加密。DB2 自己不进行网络加密。但可使用附带的 Tivoli SecureWay 实现网络加密。
审计跟踪
Oracle 容许审计跟踪用户和对象。还可使用日志挖掘程序调查和分析有疑问的查询。DB2 也提供了相似的审计设施。在 DB2 中,可使用 db2audit 实用程序进行审计跟踪。
![]() ![]() |
![]()
|
在本节中,咱们将 Oracle 对 XML 的支持与 DB2 对 XML 的支持进行比较。 Oracle XML DB 特性随 Oracle 9i Release 2 一块儿发布,借助该特性,经过定义 XMLTYPE 表和列,将它们存储为 CLOB 或拆分(分解)到关系表中,能够实现对 XML 存储、检索和模式的管理。 Oracle 10g 为管理 XML 文档提供了一些加强。例如,经过映射已有的数据,能够动态地反映模式的更改,而没必要从新导入。Oracle 10g 包括一些工具包,例如:
Oracle 10g 仍然是一种 支持 XML 的 数据库。它提供的全部接口、API 和包,都是为了减轻 XML 与关系表之间的相互转换和映射所带来的负担、复杂性和维护。支持 XML 的数据库,无论是使用 CLOB 仍是分解方法,都不能提供良好的性能。例如,在使用 CLOB 的状况下,XML 文档做为镜像文件存储在数据库中。您可能已经知道,镜像文件的管理是很麻烦的。分解方法在性能方面也不如人意。将一个 XML 文档分解成小块并存储在多个表中以后,当须要将 XML 文档组合成原样时,就不得不使用一个 SQL JOIN 操做。SQL 中的 JOIN 是开销很大的,特别是表的数量较多时这一点尤为明显。保持数字签名的保真度一样也是一个挑战。
另外一方面,DB2 9 pureXML 技术则是原生存储 XML 文档,也就是说,在内部以树型格式存储 XML 文档。它还容许同时使用 SQL 和 XML 扩展,即 Xquery 和 Xpath 来访问关系数据和 XML 数据。原生存储 XML 文档是一种更好的方法,IBM 的研究代表,使用该方法在 XML 文档的搜索和检索方面能够取得更好的性能,而且能减小某些程序中代码的行数。
要在数据库中使用 pureXML 特性,在建立数据库时要使用 UNICODE(例如使用编码集 UTF-8)。在建立一个表以前,若是没能建立一个 UNICODE 数据库,则会产生以下所示的错误:
SQL1239N XML features can only be used in a Unicode database with a single database partition. SQLSTATE=42997 |
DB2 与以前版本同样存储关系数据。可是,XML 数据是以分层格式存储的(做为使用 Xquery 数据模型的一棵树)。XML 与关系服务之间是紧密集成的。为了存储 XML 文档,用户须要建立一个表,并指定一个列使用一种新的数据类型,即 XML,以下面的例子所示。
|
下图展现了这两列的显示效果:
因为 XML 文档是以解析的分层格式存储在 XQuery Data Model (XDM) 中的,所以不须要进行转换或映射。用于存储 XML 文档的格式就是用于处理 XML 文档的格式。这样能够提供更好的性能。
备份、恢复、导入等实用程序对含 XML 列的表的做用与其余表是同样的。可使用 INSERT 语句或 IMPORT 实用程序(注意:DB2 LOAD 实用程序还不支持 XML)将 XML 数据插入 XML 列。在导入来自第三方的 XML 文档以前,最好根据一个预约义的 XML 模式验证这些文档。 为了注册一个 XML 模式,DBA 须要执行 REGISTER XML SCHEMA 命令,并以 COMPLETE XML SCHEMA 结束,以完成注册过程。 DB2 9 还支持在一个 XML 文档的子集或整个文档上建立索引。在建立索引时,须要指定 XPATH,它将指向被建索引的特定元素/属性。
在 DB2 9 中,有四种方法来访问关系数据和 XML 数据,如 图 13 所示:
表 3 比较了 DB2 9 与 Oracle 10g 的 XML 功能。
XML 功能 | Oracle 10g | IBM DB2 9 for Linux, Unix and Windows |
---|---|---|
支持 XML 的存储 | √ | 不适用 |
XML 原生存储 | × | √ |
大环境的易维护性 | × | √ |
高度可伸缩性 | × | √ |
将 XML 文档存储为 CLOB | √ | √。可是从长远看,鼓励使用 XML 原生存储 |
分解 | √ | √。可是从长远看,鼓励使用 XML 原生存储 |
要看到更深刻的讨论,能够在 developerWorks 上找到更多关于 IBM pureXML 功能的文章,例如 使用 XQuery 查询 DB2 XML 数据 和 使用 SQL 查询 DB2 XML 数据。
![]() ![]() |
![]()
|
DB2 的表分区(即区域分区)相似于 Oracle 的分区。它基本上容许将一个逻辑表拆分红跨一个或多个表空间的多个物理存储对象。每一个对象对应于一个 “分区”,容许每一个表空间包含必定范围的、很容易访问的数据。
在 DB2 中,有多种方法对数据进行分区,您能够同时将这些方法应用于相同的数据。为了不读者感到困惑,下面简单地解释一下提供这种分区的各类不一样方法:
利用 DB2 9 中新引入的表分区特性,能够根据一个或多个表列中的特定值将表数据划分到不一样的表空间。 这些分区能够独立地进行备份和恢复,能够提升某些查询的性能,由于 DB2 优化器知道这些分区的存在,而且能够避免对查询中不须要的分区进行扫描。例如,若是按一年的四个季度对表进行分区,而且查询只须要第 4 季度的数据,那么 DB2 将不解析前三个季度,而是直接找到第 4 个季度并解析之。这被称做分区排除(partition elimination)。
如前所述,在 DB2 9 中,数据组织的三种方法,即数据库分区(Database Partitioning)、表分区(Table Partitioning)和多维集群(Multi Dimensional Clustering)可同时使用。
下面的例子建立一个 customer 表,其中 l_shipdate >= '01/01/2006' 且 l_shipdate <= '03/31/2006' 的行存储在表空间 ts1 中,l_shipdate >= '04/01/2006' 且 l_shipdate <= '06/30/2006' 的行存储在表空间 ts2 中,依此类推。更详尽的解释能够参阅 developerWorks 文章 Table partitioning in DB2 9。
清单 3. 将一个表按区域分区
|
![]() ![]() |
![]()
|
Oracle 提供了两种压缩特性:一种是索引级压缩,另外一种是表级压缩。若是对这些特性没有适当的规划,就会对性能产生不良影响。
Oracle 从版本 8i 开始就引入了索引压缩。能够压缩的索引有 bitmap、btree 和索引组织的表。索引压缩使用起来很简单。例如,要用压缩特性建立一个索引,可使用以下代码:
清单 4. 用压缩特性建立索引
|
|
另外一方面,表压缩是在 Oracle 9i release 2 中引入的。它能够用于压缩整个表、表分区和具体视图。压缩可应用于全部分区或部分分区。 虽然表压缩也能够用于未分区的表,可是在 OLTP 工做负载中将表压缩应用于未分区的表并不可取,由于插入和更新性能会受到影响。在 Oracle 表压缩中,数据库块中重复的值将被去除,信息将被存储起来,以便在块中从新建立未压缩的数据。 下面的例子展现了如何用压缩特性建立分区表。
清单 6. 用压缩特性建立表
|
至于 DB2,在 DB2 9 以前就有一些压缩方法,可是,行压缩是在 DB2 9 中才引入的。行压缩要求建立一个目录,用于存储重复模式或条目以及数字键。压缩算法足够智能,不会压缩那些对节省磁盘空间帮助不大的行。
DB2 的行压缩不像 Oracle 的键压缩,它不须要指定键。
能够经过 CREATE TABLE 或 ALTER TABLE 命令在表级进行压缩。例如:
清单 7. 用 COMPRESSION YES 建立/修改表
|
为了在 DB2 Control Center 中取得相同的效果,在列定义过程当中(表建立向导中的第二步),应确保选中面板底端的复选框 Store table data in a compressed format(以下图所示)。
只有在执行 REORG 的时候才构建表字典,以后即可以压缩表中的数据。在随后的每次 REORG 操做中,表字典随之更新。被压缩的数据同时存放在磁盘上和内存中,DB2 还压缩存储在日志文件中的用户数据,以便减小日志文件大小。
注意,分区表的每一个分区能够有不一样的压缩字典,在 DPF 中的一个表的每一个分区也能够有不一样的压缩字典。
除了数据行压缩,DB2 9 提供的其余压缩机制还包括:
![]() ![]() |
![]()
|
从 Oracle 9i 到 10g,Oracle 在调优方面做了一些改进。Oracle 将如下方面的调优进行了自动化:
Oracle 还提供了一些 advisor,例如 segment advisor 和 undo advisor。segment advisor 根据对象内的空间拆分程度给出是否能够对一个对象执行新的在线压缩操做的建议。并且,这个 advisor 还给出关于段的历史增加趋势的报告,特别是能为容量规划提供有效的信息。 另外一方面,Undo Advisor 则帮助管理员在调整 flashback 和非 flashback 中的表空间的大小时做出正确的判断。它为管理员适当地设置 UNDO_RETENTION 提供建议,以免快照过于陈旧的问题。
DB2 9 引入了一些新的自治加强。例如,DB2 9 引入一种新的自调优内存特性(使用 self_tuning_mem 数据库配置参数),该特性自动地设置一些内存配置参数的值,从而简化了内存配置任务。自动调优器充当调度器的角色,它算出可用的内存资源,动态地将它们分 发给数据库的一些内存消费者。
除了自调优内存,DB2 9 还引入了下面提到的其余一些加强。这份列表并不完整,可是其中列出的都是重要的加强。
DB2 8 引入了 Configuration Advisor,它能够检测系统和数据库的特征 —— CPU、内存、数据库大小、表的数量等,并为配置参数给出建议的值。DB2 9 则更进一步 —— 它在数据库建立以后自动运行 configuration advisor,并缺省地作出一些基本的调优决定。例如,它配置缺省缓冲池的大小、I/O 清理程序和 I/O 服务器等。 这种初始的自动调优意味着,同使用以前缺省的数据库配置参数值建立的数据库相比,如今的数据库将拥有更好的性能,而且有更好的即开即用性。
缺省状况下,DB2 9 还容许对某些进行中的任务进行自动化。经过该特性,DB2 肯定须要哪些统计信息,以及哪些统计信息须要更新,而后自动在后台执行 RUNSTATS 实用程序。
DB2 9 扩展了在 DB2 V8.2.2 中首次引入的自动存储特性。自动存储自动增加跨磁盘和文件系统的数据库的大小,因为它是自动增加数据库大小的,所以 DBA 不须要管理存储容器。当在 DB2 9 中建立数据库时,自动存储管理特性是缺省地启用的。
自动重组是从 8.2 版开始引入的。可是,DB9 对其加以加强,从而容许作如下事情:
![]() ![]() |
![]()
|
咱们来看看不一样领域的一些工具,例如数据库建立和维护、网络、管理 GUI、性能调优、数据移动和备份恢复工具。图 15 显示了这些 DB2 9 GUI 工具。
让咱们看看相似的任务在 Oracle 和 DB2 9 中分别是怎样执行的。
数据库建立和维护
Oracle 提供了 Database Configuration Assistant(dbca)做为建立数据库的 GUI 工具。对于数据库维护,Oracle 提供了 Oracle Enterprise Manager。DB2 数据库则能够经过 DB2 Control Center 建立和维护。
网络
Oracle 提供了 Network Configuration Assistant(netca)来进行网络配置。或者,也可使用 Oracle Network Manager 来配置服务名、侦听器、配置文件和 Oracle 名称服务器。DB2 则使用 CATALOG 命令来编目节点和数据库。此外还可使用 DB2 命令行或 DB2 Configuration Assistant GUI 进行编目。
管理
Oracle Enterprise Manager 提供了针对管理员平常任务的普遍管理功能。DB2 Control Center 也提供了和 Oracle Enterprise Manager 相似的功能。除了 DB2 Control Center 外,还可使用 DB2 命令行处理器来发出 DDL 和 DML 语句。该实用程序相似于 Oracle 的 SQLPLUS 实用程序。图 16 显示了 DB2 命令行处理器。
还能够在 Command Center 中发出命令,如 图 17 所示。
性能调优
Oracle Enterprise Manager 附带有 Change Management Pack、Tuning Pack 和 Diagnostic Pack。DB2 则提供了 Event Analyzer、Health Center、Indoubt Transaction Manager 和 Memory Visualizer 做为性能调优任务的 GUI 工具。
数据移动
Oracle 提供了 SQL Loader(sqlldr)用于以定界文本格式装载数据。Import(imp)和 export(exp)可用于执行逻辑导入和导出。DB2 提供了相似的导入、导出和装载实用程序。对于跨平台的数据移动,DB2 提供了 db2move 实用程序。
备份和恢复
Oracle 提供了 Recovery Manager 做为热备份的选项。在 DB2 中,可使用 backup 命令或 DB2 Control Center 备份数据库。
Oracle 10g Enteprise Manager 附带了新的性能概要表。加强的 Oracle Enterprise Manager HTML 界面为全部与数据库性能相关的统计信息提供了一个集中的访问点,为全面的监控和诊断提供了方便。
除了随 DB2 UDB version 8 发布的界面外,DB2 9 还引入了一种全新的免费应用程序开发工具,这个工具叫作 DB2 Developer Workbench(DWB),它是基于 Eclipse 框架的。这个工具能够单独下载,也可经过光盘得到,它替代了 DB2 8 的 Development Center。 DWB 是用于建立、编辑、调试、部署和测试 DB2 存储过程和用户定义函数的一站式中心。此外,还可使用 DWB 来开发 SQLJ 应用程序,以及建立、编辑和运行 SQL 语句和 XML 查询。
DWB 有一些用于开发 DB2 业务对象的视图,例如:
除了 DB2 8 的 Development Center 的功能外,新的 Developer Workbench 还包括对迁移报告、比较例程、XML 函数和使用 XQuery Builder 构建 XQuery 查询等等的支持。 如今能够从网站下载DB2 Developer Workbench 。
要了解关于 DB2 Developer Workbench 的更详细的信息,请阅读 developerWorks 中的这篇 教程。 要获得更详尽的示例和特性,请参考 developerWorks 中的文章 DB2 9 入门: 应用程序开发方面的加强。
图 18 展现了如何使用 DWB 建立存储过程:
![]() ![]() |
![]()
|
在 本文中,咱们借助您当前已有的关于 Oracle 10g Release 2 的知识,对 DB2 9 for Linux, UNIX and Windows 进行了介绍。咱们简要地描述了 DB2 9 架构、后台进程、内存模型、安全性、工具等方面。Oracle 与 DB2 9 之间有不少相似之处,咱们也指出了它们之间的一些不一样之处,以便您能借助已有的知识,在 DB2 9 中得到成功。
表 3 总结了咱们讨论过的 Oracle 与 DB2 9 之间的相同点与不一样点。
表 3 —— Oracle 与 DB2 9 概念总结Oracle | DB2 9 | 注解 |
实例 | 实例 | 一个 DB2 实例能够包含多个数据库 |
数据库 | 数据库 | |
initSID.ora 或 SPFILE | DBM CFG 和 DB CFG | DB2 使用两个级别的配置:Database Manager Configuration(DBM CFG)(实例级)和 Database Configuration(DB CFG)(数据库级)。与 Oracle 同样,不少配置参数能够动态更改 |
表空间 | 表空间 | DB2 支持 SMS 和 DMS 这两类表空间。DMS 表空间与 Oracle 的表空间相似 |
数据块 | 页 | DB2 支持如下几种页大小:4k、8k、16k 和 32k。一个行必须可以装入其中一种数据页内。它不能像在 Oracle 中那样跨多个页 |
盘区 | 盘区 | |
数据文件 | DMS 表空间容器 | 用于 DMS 表空间的容器能够是原始设备,也能够是文件 |
重作日志文件 | 事务日志文件 | |
数据缓冲区 | 缓冲池 | DB2 没有一组预约义的缓冲池,可是能够根据须要建立足够多的缓冲池。在建立具备给定页大小的表空间时,必须预先存在一个具备给定页宽的缓冲池 |
SGA | 数据库管理器共享内存和数据库共享内存 | |
数据字典 | 编目 | |
库缓存 | 包缓存 | |
大型池 | 实用程序堆 | |
数据字典缓存 | 编目缓存 | |
SYSTEM 表空间 | SYSCATSPACE 表空间 |