讓Oracle跑得更快2

讓Oracle跑得更快2

ITPUB技術叢書讓Oracle跑得更快2—基於海量數據的資料庫設計與最佳化 坦白地說,關於資料庫的架構問題,特別是在海量數據情況下的資料庫架構設計,我認為是一件不太容易的事情。 (2)資料庫設計對於海量數據的資料庫來說更有意義,更為重要。

圖書信息

ITPUB技術叢書

讓Oracle跑得更快2—基于海量數據的資料庫設計與最佳化
譚懷遠著
ISBN 978-7-121-13921-5
2011年7月出版
定價:69.00元
16開
452頁

宣傳語

國內第一本以作者10年的工作經歷打造的
基於海量數據的資料庫設計與最佳化的書籍

內 容 簡 介

資料庫設計,是最近幾年才出現的技術領域,再早的時候,資料庫是以一個黑盒的方式,附屬到某個系統當中的,開發人員對它的關注非常少。
近年來,由於很多系統數據量呈幾何級數激增,各種性能問題日益凸顯出來,而這種性能問題絕大多數都落在了數據的載體—資料庫身上,因此,人們越來越關注資料庫的性能。而一個資料庫性能的好壞,通常是在系統設計階段就決定了的,於是,將資料庫從系統設計中拿出來單獨進行設計,變得越來越主流了。
這是一本以討論海量數據環境下Oracle資料庫設計與最佳化的書籍,也是作者10年來從事Oracle資料庫工作的心得體會,是作者工作經驗的結晶,這樣的書籍並不多見。
本書通篇圍繞著在海量數據環境下,如何構造一個高效的Oracle資料庫這一核心,將許多相關技術融匯到這個核心話題當中,這些技術包括:分區、索引、資料庫對象屬性、並行技術、唯讀表空間、初始化參數、幾種常見的資料庫架構,以及在特定資料庫架構下資料庫的備份和恢復等相關技術。
本書適合於Oracle DBA、開發人員、項目經理或者其他對資料庫性能感興趣的人員。

懷遠君寫的第一本書《讓Oracle跑得更快—Oracle 10g性能分析與最佳化思路》於2010年8月出版,曾經在China-pub(中國互動網)和噹噹網的銷量榜的前列占據了很長時間。在給該書寫序的時候,曾經想拋磚引玉,鼓勵勤於筆耕的懷遠君繼續在最佳化問題上深入下去。現在時間過去了快一年,新書《讓Oracle跑得更快2—基於海量數據的資料庫設計與最佳化》也即將面世。
針對海量數據的資料庫設計方面的書,在國內市面上並不多見,本書可以看成國內作者在這個領域裡一個新的探索和嘗試。隨著近年來很多系統中數據量呈幾何級數的暴增,對於存放這些數據的資料庫的關注,被提到了一個新的高度,這完全是系統需求使然,而系統需求,即為用戶需求,海量數據的資料庫設計,不可避免地變成系統設計中的一個新領域。
縱觀全書,可以視為作者第一本書的內容延續和技術的繼續探討,在第一本書里沒有涉及的分區、索引、壓縮、RAC、存儲規劃等內容,在本書里均進行了深入討論。
關係資料庫誕生已經有30多年時間,這幾十年是數據大量增長、信息爆炸的年代,經過積累,很多套用的數據量已經非常可觀。作為這些數據的載體、容器,資料庫承受著日益增長的壓力。如何面對海量數據帶來的存儲、查詢速度、災備等方面的壓力,是每位資料庫工程師所必須面對的課題。
本書的內容,對於處於一線面臨海量數據壓力的專業人員具有很好的參考價值;同時,對於處於系統設計、項目經理等職位的人員,也具有極好的參考價值,可以看做是作者的另一部心血力作。
ITPUB創始人tigefish
2011年

前 言

一年前的這個時候,我也是在寫一本書,書名叫《讓Oracle跑得更快—Oracle 10g性能分析與最佳化思路》。
那是一本講Oracle性能最佳化的書,書是在2010年8月初上市的,銷量出乎意料的好,曾經一度在中國互動出版網上排在計算機類書的銷售第一位,隨後在噹噹網的資料庫類書中也長時間占據著銷售排名的首位。
現在的這本書可以看作是《讓Oracle跑得更快—Oracle 10g性能分析與最佳化思路》的姊妹篇,它繼承了上一本書的核心內容,就是寫資料庫的性能;同時,也保持了上一本書的寫作風格,就是用一種思考和啟發的方式來寫作。
《讓Oracle跑得更快—Oracle 10g性能分析與最佳化思路》主要是以知識點作為切入點來討論Oracle資料庫的性能分析和最佳化,比如並行技術、執行計畫、最佳化器、AWR報告等;而本書就顯得更加具體和有針對性,它主要是討論在海量數據的情況下,資料庫的設計和最佳化相關的話題。
這樣,本書和《讓Oracle跑得更快—Oracle 10g性能分析與最佳化思路》的內容疊加起來,就基本上形成了一套比較完整的關於資料庫性能最佳化方面的書籍。
為什麼一定要寫關於資料庫性能方面的書籍呢?
我一直都持有這樣一種觀點:現在很多的系統中,資料庫的功能正在從數據存儲工具的角色慢慢轉變成數據處理器的角色。
近年來,用戶對系統的性能要求變得越來越高,這和用戶對系統的依賴性變得越來越強直接相關;而這種性能實際上很多時候就是指資料庫的性能,因為資料庫是數據的最終載體和數據分析、處理的機器(大多數時候)。
於是,資料庫的性能問題就日益凸顯出來,無論是項目負責人、開發人員還是DBA,都不可迴避地要面對這個問題,唯一的區別是各自考慮的層面不同而已。
記得上一本書上市不久,ITPUB的創始人Tigerfish先生就鼓勵我再寫一本關於資料庫設計方面的書,他的原話是這樣的:
當DBA從煩瑣的日常工作脫身出來舉目遠望的時候,再往前的一片田野便是架構問題,最好的、最徹底的能一勞永逸的最佳化,往往從架構設計開始。期待懷遠君將來的新作,可以在這片更廣闊的天地里馳騁。
在之後的溝通中,他又提及了幾次,這種友好的鼓勵變成了我開始考慮寫這本書的原動力。
Tigerfish先生說得沒錯,真正的一勞永逸地解決問題的方法,就是在架構設計上。
一個好的架構,會使一個系統充滿了可用性和擴展性;反之,就會後患無窮,開發人員要付出大量的後續工作,來修補這種架構缺陷導致的後遺症。
坦白地說,關於資料庫的架構問題,特別是在海量數據情況下的資料庫架構設計,我認為是一件不太容易的事情。
一方面,它和業務息息相關,需要考慮很多業務需求。
另一方面,數據系統架構設計,就其本身而言,在很多地方又有很大的獨立性,比如:
● 分散式資料庫架構
● RAC架構
● Data Guard架構
● 存儲架構
最初想寫很多內容,除了上面提及的資料庫本身的架構設計外,還考慮對幾種典型的系統,比如OLTP、OLAP的資料庫架構問題進行討論,甚至包括中間件架構、網路架構等。這看起來真是一個十分龐大的工程!
最終我放棄了這么龐大的內容,決定專心來寫關於海量數據的資料庫架構設計,這主要考慮到以下幾個原因:
(1)我本人從事海量數據的資料庫DBA工作超過10年,對這一塊比較熟悉。
(2)資料庫設計對於海量數據的資料庫來說更有意義,更為重要。
當數據量大到一定程度時,很多看似不是問題的問題都變成了問題。
這樣的資料庫要解決數據的裝載、數據的存儲、數據的處理、數據的備份和恢復,這在海量數據的情況下,並非一件容易的事情(實際上,是一件很麻煩的事情)。
(3)資料庫的數據越來越多,數據越來越受到重視。
隨著信息化的進程越來越快,以前不是海量數據的資料庫,現在也變成了海量數據的資料庫;以前沒有太關注的數據,現在也被嚴重關注。
基於以上三點原因,我決定只寫海量數據的資料庫設計;而對於一些OLTP相關的技術,書中有提到,但沒有做過多的介紹,比如並發、綁定變數和OLTP相關的初始化參數都簡單帶過,這樣讓本書的內容看起來更有針對性一些。
實際上,如果要比較OLTP和OLAP資料庫設計在系統設計中的重要程度,我認為對後者的關注更應該多一些,主要原因是:
(1)在OLTP資料庫層面,相對簡單,因為它的數據量顯得不是那么“大”,很多常規的方法都可以使用,並且還有很多現成的技術都可以用。
(2)對於OLTP系統,即使數據量相對較大,但是SQL操作相對簡單,通常來說,SQL執行都是一個很快的過程。
這可以用一個小例子來說明。
對於OLTP系統的資料庫,SQL語句大多是這樣的:
select *
from
test where object_id=100
這些SQL語句的特點是,它們的謂詞條件主要是這樣的:
where col=…
而這些欄位上都創建了索引,同時索引鍵值的重複率非常低(比如銀行賬戶、股票交易代碼),甚至很多時候這些欄位都是主鍵(不允許有鍵值重複)。
這樣的特性,使得OLTP系統資料庫中的SQL執行通常都非常快。比如,下面就是這條SQL語句的執行結果,我們看到執行時間只能用毫秒衡量。
call count cpu elapsed disk query current rows
------- ------ ------- --------- -------- --------- -------- -------
parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 9 0 4
------- ------ ------- --------- -------- --------- -------- -------
total 4 0.00 0.00 0 9 0 4
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 55
Rows Row Source Operation
------- ---------------------------------------------------
4 TABLE ACCESS BY INDEX ROWID TEST (cr=9 pr=0 pw=0 time=143 us)
4 INDEX RANGE SCAN TEST_IDX (cr=4 pr=0 pw=0 time=289 us)(object id 51366)
******************************************************************************
而在OLAP系統資料庫中,通常運行著一些類似於下面的這種SQL語句,它們的主要作用是進行數據分析和聚合處理。
select object_type,count(*)
from
test group by object_type
OLAP系統資料庫的數據量非常大,它們消耗的系統資源要遠遠大於OLTP系統中SQL消耗的系統資源。下面是上面SQL語句的執行情況。注意:這只是演示的例子,實際上,這些SQL語句的執行時間要遠遠長於這個時間。
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 4 0.21 0.22 0 3550 1 39
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 6 2.21 2.32 0 3550 1 39
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 55
Rows Row Source Operation
------- ---------------------------------------------------
39 HASH GROUP BY (cr=3550 pr=0 pw=0 time=220962 us)
198980 TABLE ACCESS FULL TEST (cr=3550 pr=0 pw=0 time=597066 us)
********************************************************************************
(3)對於數據備份,OLTP系統資料庫可以使用rman增量的方式備份,也可以使用Data Guard來解決數據安全問題。
(4)對於OLTP系統的高並發,可以考慮使用中間件層間來解決。
(5)要提高OLTP資料庫的處理效率,可以使用處理能力高的伺服器。
(6)要提高OLTP資料庫的數據訪問速度,可以考慮使用記憶體資料庫
……
總之,對於OLTP系統,在資料庫層面找到一個合適的解決方案,還不是一件非常困難和費神的事情。
反過來看OLAP系統資料庫(或者數據倉庫系統資料庫),由於數據量太大,很多問題都變得很難,比如,對於一個1000TB數據的資料庫,可能下面的問題都會使你非常頭痛:
● 如何規劃數據存儲?
● 如何管理這些數據,包括備份和恢複數據?
● 如何最佳化查詢?
● 如何實現容災,保證業務不中斷?
可以說,上面的每一條都非常困難,都需要全局地考慮用戶需求、業務流程等一系列因素,通過各方權衡找到一個最終的解決方案。
上面談的內容,就是我想寫這本書的目的。和我的上一本書一樣,實際上是在討論對問題的一些思路,它可能沒有提供一個完整、具體的解決方案,但是可以幫助啟發讀者的思維,提供一些參考和幫助。
我也看了《讓Oracle跑得更快—Oracle 10g性能分析與最佳化思路》的一些書評,發現一些讀者反映書中的內容寫得不夠深入,在這裡我順便做一些解釋:
我一直認為,對於一個技術,最重要的不是這個技術本身的機制,而是什麼時候使用這個技術。
這看起來就像一種本末的關係,比如,可以使用很多示例來說明強制變數綁定和變數窺視(bind peeking)機制,一直到我們明白這個過程的每個環節中Oracle做了什麼。
但是當我們抬起頭來接受別人的質詢:
“我們這個系統需要強制變數綁定嗎?”
時,我們真的能立刻做出回答嗎?
我們知道系統的並發情況嗎?
我們知道每天用戶的主要工作是什麼嗎?
我們知道系統是屬於OLAP還是OLTP,抑或是二者的一個混合體?
對技術精益求精是技術人員的一種學習方式,但絕不等同於不加選擇盲目地沉迷技術,技術終歸是為系統服務的,讓系統保持健康和高效才是做技術的最終目的。
“授人以魚,不如授人以漁。”
本書雖然談不上是“漁”,但是這是作者的寫作思路,我希望通過本書,把自己10多年來的Oracle DBA經驗和大家分享,如果能夠使讀者有所收益,那將是我最高興的事情!

目 錄

第一篇 分 區
第1章 分區的淵源 2
1.1 DELETE與系統資源 3
1.2 DELETE與釋放空間 10
第2章 分區在海量資料庫中的套用 15
2.1 分區的種類 16
2.1.1 範圍分區 16
2.1.2 哈希分區 35
2.1.3 列表分區 42
2.1.4 組合分區 43
2.2 三種分區的比較 46
2.2.1 範圍分區的適用情況 47
2.2.2 哈希分區的效率 47
2.2.3 列表分區與範圍分區各自的優勢 54
2.3 小結 61
第二篇 索 引
第3章 B樹索引 64
3.1 B樹索引概述 65
3.2 B樹索引的效率 66
3.2.1 主鍵或者唯一性約束 66
3.2.2 鍵值重複率低的欄位比較適合使用B樹索引 77
第4章 點陣圖索引 85
4.1 點陣圖索引概述 86
4.2 什麼時候使用點陣圖索引 97
第5章 全文索引 109
5.1 全文索引概述 109
5.1.1 全文索引和普通索引的對比 110
5.1.2 全文索引的對象 114
5.1.3 全文索引在海量資料庫中的套用 123
5.2 全文索引的空間 138
5.3 全文索引和DML操作 145
5.3.1 INSERT操作 146
5.3.2 DELETE操作 149
5.3.3 UPDATE操作 150
5.4 CTX_REPORT工具包 154
5.4.1 CTX_REPORT.DESCRIBE_INDEX 158
5.4.2 DESCRIBE_POLICY函式 161
5.4.3 CREATE_INDEX_SCRIPT函式 162
5.4.4 CREATE_POLICY_SCRIPT函式 164
5.4.5 INDEX_SIZE函式 165
5.4.6 INDEX_STATS存儲過程 168
5.4.7 QUERY_LOG_SUMMARY存儲過程 170
5.5 小結 175
第三篇 對 象 屬 性
第6章 對象屬性概述 178
6.1 Oracle資料庫中的對象屬性 178
6.2 對象屬性和系統的關係 183
第7章 並行度 185
7.1 對象屬性上的並行 186
7.2 使用Hint方式並行執行 189
7.3 索引上的並行度 193
第8章 數據壓縮 198
8.1 數據壓縮技術的套用 199
8.2 分區索引的壓縮 203
8.3 數據壓縮的優越性 205
8.3.1 節省空間 205
8.3.2 性能的提高 212
8.4 DML操作和數據壓縮 219
第9章 唯讀表空間 227
9.1 唯讀表空間與數據備份和恢復的關係 228
9.2 唯讀表空間對於資料庫的啟動和關閉的影響 231
9.3 唯讀表空間可以防止數據被意外刪除和修改 237
9.4 唯讀表空間使表空間的管理更加方便 240
第10章 資料庫對象的分析 245
10.1 CBO和rBO 246
10.2 分析和動態採樣 251
10.3 對象分析的頻度 254
10.3.1 數據入庫後不再改變 255
10.3.2 數據存在表中且經常改變 271
第四篇 海量數據的資料庫架構設計
第11章 RAC架構 285
11.1 RAC在海量資料庫中的套用 293
11.2 RAC架構之業務分割 295
11.3 RAC架構之負載均衡 308
11.3.1 客戶端的負載均衡 308
11.3.2 伺服器端的負載均衡 313
11.4 RAC架構之failover 316
第12章 分散式資料庫架構 319
12.1 分散式資料庫的優越性 319
12.2 分散式資料庫的數據處理 321
12.3 分散式資料庫的字元集 323
第13章 Data Guard架構 325
13.1 Data Guard概述 326
13.2 Data Guard的保護模式 329
13.2.1 最高數據保護模式 329
13.2.2 最高性能模式 329
13.2.3 最高可用性模式 330
13.3 Data Guard和RAC 331
13.4 Data Guard中Standby資料庫的類型 332
13.4.1 物理Standby資料庫 332
13.4.2 邏輯Standby資料庫 333
第14章 存儲架構的設計(ASM+SAN) 335
14.1 ASM 336
14.1.1 方便存儲管理 337
14.1.2 ASM的一個管理工具—asmcmd 345
14.1.3 存儲的高可用性 348
14.1.4 提升存儲性能 350
14.2 SAN 352
第15章 海量數據的備份和恢復 354
15.1 傳統的數據備份方案 354
15.1.1 通過數據導出方式備份數據 355
15.1.2 資料庫冷備份 355
15.1.3 資料庫熱備份 356
15.2 海量數據的資料庫備份和恢複方案 357
15.2.1 使用分散式資料庫 357
15.2.2 以傳遞表空間的方式對表空間進行備份和恢復 358
15.2.3 對載入數據進行備份 368
第五篇 初始化參數
第16章 記憶體相關的參數 373
16.1 SGA_TARGET 373
16.2 PGA_AGGREGATE_TARGET 379
第17章 I/O相關的參數 382
17.1 DB_FILE_MULTIBLOCK_READ_COUNT 383
17.2 和資料庫I/O及數據檔案相關的其他4個參數 388
17.2.1 DB_WRITER_PROCESSES 388
17.2.2 DISK_ASYNCH_IO 389
17.2.3 DBWR_IO_SLAVES 389
17.2.4 DB_FILES 390
第18章 最佳化器相關的參數 391
18.1 CURSOR_SHARING 391
18.2 OPTIMIZER_DYNAMIC_SAMPLING 394
18.3 OPTIMIZER_MODE 398
18.3.1 ALL_ROWS 398
18.3.2 FIRST_ROWS_n 398
18.3.3 FIRST_ROWS 399
第19章 其他的參數 400
19.1 並行相關的參數 400
19.1.1 在對象的屬性中設定並行 401
19.1.2 在Hint中使用並行 401
19.2 分散式資料庫相關的參數 404
附錄A Oracle字元集 406
附錄B SHOW_SPACE存儲過程 415
附錄C 一個典型的OLAP系統資料庫的設計方案 419

相關詞條

相關搜尋

熱門詞條

聯絡我們