分類: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 表空間 |