Oracle數(shù)據(jù)庫性能優(yōu)化技術
每一個企業(yè)都應該有獨立的IT戰(zhàn)略, 這與今天企業(yè)的CEO/CFO所關注的目標是有很大關系的。對于CEO來說, 他最關心的是企業(yè)發(fā)展、業(yè)務布局、品牌影響力以及市場份額, 而對于CFO而言, 則是營收、利潤以及成本。而對于那些已經(jīng)建立起成熟體系的企業(yè)而言, 怎樣才能不讓成為整個企業(yè)發(fā)展的瓶頸甲骨文公司大中華區(qū)產(chǎn)品戰(zhàn)略數(shù)據(jù)庫增值軟件總監(jiān)馮葵認為其重點在于四個方面可用性、業(yè)務連續(xù)性、管理效率以及合法合規(guī), 這些特點有效輔助了數(shù)據(jù)庫產(chǎn)品, 成為數(shù)據(jù)庫與應用之間的磨合劑。
今天沒有一個事務、一個技術或者一個產(chǎn)品可以達到100%的可靠。它一定會在某個時候發(fā)生各種各樣的問題。從產(chǎn)品和技術的角度來說, 這似乎無法根本解決, 但如果通過有效的架構, 這種可用性就可以真正實現(xiàn)。Oracle數(shù)據(jù)庫企業(yè)版的內(nèi)存數(shù)據(jù)庫高速緩存選件是基于Oracle TimesTen內(nèi)存數(shù)據(jù)庫構建的, 它能夠區(qū)分哪些信息是不太經(jīng)常使用的, 哪些信息是經(jīng)常使用的, 從而幫助你將“活” 的數(shù)據(jù)運行在高性能的存儲設備上, 而不太使用的數(shù)據(jù)則可以運行在低速設備上或便宜的設備上。這有效突破了傳統(tǒng)密集I/O的瓶頸, 不但可以有效地進行負載均衡,而且提供非常強大的性能,從而確保數(shù)據(jù)庫里的信息能獲得極高的可用性。
一、 oracle數(shù)據(jù)庫及特點
oracle是一個功能極其強大的數(shù)據(jù)庫系統(tǒng)。它起始于七十年代末的關系型數(shù)據(jù)庫技術。這種類型數(shù)據(jù)庫的關鍵是怎樣理解數(shù)據(jù)間的關系,然后構造反映這些關系的信息庫。oracle成功的將關系型數(shù)據(jù)庫轉移到桌面計算機上,提供了一個完整的客戶/服務器體系結構的商用DBMs。同時它利用SQL*NET軟件層,與多種操作系統(tǒng)支持通信協(xié)議相配合,為oracle關系型數(shù)據(jù)庫提供分布式環(huán)境,可以實現(xiàn)單點更新,多點查詢。Oracle數(shù)據(jù)庫已經(jīng)被用于各種大型信息系統(tǒng)中,特別是諸如銀行,保險,煙草,石油等大數(shù)據(jù)量,對安全性要求較高的企業(yè)。其特點主要體現(xiàn)在:
1)支持大數(shù)據(jù)庫、多用戶的高性能事務處理Oracle支持最大數(shù)據(jù)庫(幾百TB),可充分利用硬件設備。支持大量用戶同時在同一數(shù)據(jù)上執(zhí)行各種應用,并使數(shù)據(jù)爭用最小,保證數(shù)據(jù)的一致性。
2)硬件環(huán)境獨立。Oracle具有良好的硬件環(huán)境獨立性,支持各種類型的大型,中型,小型和微機系統(tǒng)。
3)遵守數(shù)據(jù)存取語言、操作系統(tǒng)、用戶接口和網(wǎng)絡通信協(xié)議的工業(yè)標準。
4)較好的安全性和完整控制。Oracle有用戶鑒別、特權)、角色、觸發(fā)器、日志、后備等功能,有效地保證了數(shù)據(jù)存取的安全性和完整性以及并發(fā)控制和數(shù)據(jù)的回復。
5)具有可移植性、可兼容性與可連接性oracle不僅可以在不同型號的機器上運行,而且可以在同一廠家的不同操作系統(tǒng)支持下運行。具有操作系統(tǒng)的獨立性。
二、 數(shù)據(jù)庫系統(tǒng)性能評價指標
主要從以下幾個方面進行:
1)系統(tǒng)吞吐量。
吞吐量是指單位時間內(nèi)數(shù)據(jù)庫完成的SQL語句數(shù)目,以每秒鐘的事務量(tps)表示。提高系統(tǒng)吞吐量可以通過減少服務時間在同樣的資源環(huán)境下做更多的工作或通過減少總的響應時間使工作做得更快這兩種方法來實現(xiàn)。
2)用戶響應時間。
響應時間是指用戶從提交SQL語句開始到獲得結果集的第一行所需要的時間,是應用做出反應的時間,以毫秒或秒表示。響應時間可以分為系統(tǒng)服務時間(CPU時間)和用戶等待時間兩項。也就是說,要獲得滿意的用戶響應時間有兩個途徑:一是減少系統(tǒng)服務時間,即提高數(shù)據(jù)庫的吞吐量;二是減少用戶等待時間,即減少用戶訪問同一數(shù)據(jù)庫資源的沖突率。 #p#page_title#e#
3)數(shù)據(jù)庫命中率。
Oracle用戶進程所需的所有數(shù)據(jù)都是經(jīng)過緩沖區(qū)高速緩存來存取的。用戶對數(shù)據(jù)的需求能否在內(nèi)存中得到滿足,給出快速的響應,可用緩沖區(qū)高速緩存命中率來衡量。該比率等于高速緩存命中總數(shù)除以對高速緩存的查找總數(shù)。由于從高速緩存中讀數(shù)據(jù)比從磁盤中讀數(shù)據(jù)的開銷要小得多,因此一般應使該命中率足夠高。
4)內(nèi)存使用情況。
內(nèi)存的使用情況主要體現(xiàn)在可共享內(nèi)存、永久性內(nèi)存和運行時內(nèi)存這三者的分配使用上。內(nèi)存是否合理使用,一般考慮的主要調(diào)整目標有兩條:使投資得到最大回報。把時間和精力用于解決可能產(chǎn)生最大利益的問題;使爭用減到最小。瓶頸的特點在于延遲和等待,盡可能地消除或減少它。
5)磁盤I/O。
數(shù)據(jù)庫中發(fā)生的每個動作幾乎都將產(chǎn)生某種類型的I/O活動,該活動可以是邏輯的(在內(nèi)存中),也可以是物理的(在磁盤上)。通過降低不必要的I/O開銷可以增加用戶任務可獲得的吞吐量,縮短用戶響應時間。其中,磁盤I/O操作是數(shù)據(jù)庫性能最重要的方面,是計算機最大的開銷。
三、 oracle數(shù)據(jù)庫應用系統(tǒng)性能優(yōu)化的主要方向
1) CPU利用
CPU是服務器的重要資源, 服務器良好的工作狀態(tài)是在工作高峰時CPU的使用率在90%以上。在大型的應用系統(tǒng)中,比較流行的配置是oracle+unix,如IBM的小機,sun公司的red hat等。這些系統(tǒng)中使用sar-u命令查看CPU的使用率,Windows系列的操作系統(tǒng)的服務器,可以使用性能管理器來查看CPU的使用率。Oracle中:v$sysstat數(shù)據(jù)字典中“CPU used by this session”記錄了數(shù)據(jù)庫使用的CPU時間,“OS User level CPU time”統(tǒng)計了操作系統(tǒng)用戶態(tài)下的CPU時間,“ OS System call CPU time”統(tǒng)計了操作系統(tǒng)系統(tǒng)態(tài)下的CPU時間,操作系統(tǒng)總的CPU時間就是用戶態(tài)和系統(tǒng)態(tài)時間之和,如果Oracle數(shù)據(jù)庫使用的CPU時間占操作系統(tǒng)總的CPU時間90%以上,說明服務器CPU基本上被Oracle數(shù)據(jù)庫使用著,這是合理,反之,說明服務器CPU被其它程序占用過多,Oracle數(shù)據(jù)庫無法得到更多的CPU時間。出現(xiàn)CPU資源不足的原因可能是SQL語句的重解析、低效率的SQL語句、鎖沖突等。
2) 內(nèi)存分配
內(nèi)存參數(shù)的調(diào)整主要是指Oracle數(shù)據(jù)庫的系統(tǒng)全局區(qū)SGA(System Global Area)的調(diào)整。SGA是Oracle數(shù)據(jù)庫的心臟,是對數(shù)據(jù)庫數(shù)據(jù)進行快速訪問的一個系統(tǒng)區(qū)域,可以被服務器和用戶共享。SGA主要由三部分構成:共享池(SharePool)、數(shù)據(jù)緩沖區(qū)(Data Buffers)、日志緩沖區(qū)(Redo Log Buffers)和PGA區(qū)域。SGA隨著不同的環(huán)境而不同,沒有一種通用的最佳方案,但在設置它之前要先考慮以下的幾個方面:物理內(nèi)存多大:操作系統(tǒng)是哪種以及占多大的內(nèi)存,數(shù)據(jù)庫系統(tǒng)是文件系統(tǒng)還是存儲設備;數(shù)據(jù)庫運行的模式。SGA占有物理內(nèi)存的比例沒有嚴格的規(guī)定,只能遵從一般的規(guī)則:SGA占據(jù)物理內(nèi)存的40%~60%左右。如果通過直觀的公式化來表達則為:OS使用內(nèi)存+SGA+并發(fā)進程數(shù)×(Sort_
area_size+Hash_area_size+2M)<0.7RAM,以這個公式為參考進行自由調(diào)整即可。初始化參數(shù)文件中的一些參數(shù)對SGA的大小有決定性的影響。每個緩沖區(qū)的大小等于參數(shù)Db_block_size的大小。Oracle數(shù)據(jù)庫塊以字節(jié)表示大小。 #p#page_title#e#
四、 oracle數(shù)據(jù)庫性能優(yōu)化方法
1)建立索引
表格是關系型數(shù)據(jù)庫的基礎,數(shù)據(jù)庫中的所有信息都是以表格的形式來存放的。由于Oracle 數(shù)據(jù)庫是一個大型的數(shù)據(jù)庫,存儲著大量的數(shù)據(jù)信息。它使用一個內(nèi)置的優(yōu)化器來決定檢索數(shù)據(jù)的最快方法。在Oracle 的性能優(yōu)化中,適當?shù)慕⑺饕呛荜P鍵的。
(a) 低選中率的列建立位映射索引:為那些唯一度很低的列創(chuàng)建位映射索引, 位映射索引能夠極大地幫助改善讀性能。
(b) 為不平衡的B* 樹索引創(chuàng)建反轉關鍵字索引:反向鍵索引是一種B* 樹索引。在這種索引方式中,關鍵字值的字節(jié)是按照相反的順序存儲的。
(c) 要建立合適的索引,還必須考察select 和where 子句,因為這是查詢優(yōu)化的首要焦點。當索引包括多列時,就構成了復合索引。
使用索引可以提高檢索數(shù)據(jù)的效率, 但并不是說只要有索引,檢索的效率就會提高,添加索引是以增大存儲量和降低插入性能為代價的。這里存在著“百分之二十”的規(guī)則,當從表格中選取的行超過總行數(shù)的百分之二十時,表上的索引不會提高檢索的速度,因此在創(chuàng)建索引時要考慮到這一點。不合適的索引將會導致查詢性能的嚴重降低,應在SQL 語句中將這索引隱藏。
2)優(yōu)化SQL語句
SQL 是一種非過程化語言, 它一次處理的是一個記錄集合,對數(shù)據(jù)提供自動導航。SQL 允許用戶在高層的數(shù)據(jù)結構上工作,而不是對單個記錄進行操作。SQL 不要求用戶指定對數(shù)據(jù)的存取方法,而是使用查詢優(yōu)化器,由系統(tǒng)決定對指定數(shù)據(jù)存取的最快速手段。當關系數(shù)據(jù)庫的設計者在關系表上定義了索引之后,系統(tǒng)會自動地利用索引進行快速檢索,用戶不需知道表上是否有索引以及表有什么類型的索引等細節(jié)。在SQL 語句中,應注意以下幾點:①在where 子句中,若使用and 條件,應將最有可能導致查詢失敗的條件放前面;若使用or 條件,應將最有可能致查詢失敗的條件放在后面;②進行多表查詢時, 應將返回行少的表放在from 子句的后面,在where 子句中, 應將記錄多的表的字段寫在左邊。值得注意的是,對那些寫得不好的小SQL 語句進行優(yōu)化更為重要,因為這些小的SQL 語句每天可能被訪問成千上萬次。
3)碎片問題
碎片是由于同一磁盤的各個部分分散在磁盤的不同區(qū)域產(chǎn)生的。在刪除磁盤上的文件和添加新文件時會產(chǎn)生碎片。碎片的大量存在減慢了磁盤訪問的速度,并降低了磁盤操作的綜合性能。為了預防碎片,Oracle 提供兩類表空間:①字典管理的表空間。在這種方式下,擴展管理是通過數(shù)據(jù)字典完成的。這是一種常規(guī)的和缺省的表空間類型;②本地管理的表空間,擴展管理是表空間自身完成。一旦選擇了一個指定的類型,就不能更改。在OLTP 環(huán)境中,碎片是索引的禍根。Oracle 提供了兩種方法來消除現(xiàn)存索引中的碎片:聯(lián)機重建(Rebuild)和內(nèi)置合并(Coalesce)。通過聯(lián)機重建機制,索引可以完全地重建,這樣就能恢復空間并且重新定位它。Rebuild 可以重新將一個索引定位到另一個表空間中。Coalesce 并不要求大量的磁盤空間,因為它在相同的索引內(nèi)操作。它基本上是合并那些有相同分枝的葉節(jié)點。換句話說,它合并那些在過去分離的葉節(jié)點塊。它釋放葉節(jié)點塊以備將來使用。
4)調(diào)整系統(tǒng)參數(shù)
每次在數(shù)據(jù)服務器上啟動數(shù)據(jù)庫系統(tǒng)時,就會在內(nèi)存分配一個系統(tǒng)全局區(qū)(System Global Area),簡稱SGA。系統(tǒng)全局區(qū)用于存放系統(tǒng)信息,所有的用戶進程和服務進程都可以訪問這個內(nèi)存結構。由于內(nèi)存讀取數(shù)據(jù)比磁盤讀取要快得多,所以調(diào)整SGA 參數(shù),可使Oracle 發(fā)揮最大效能。如果SGA 太小,就無法高效地完成Oracle 中的操作,如果SGA 太大,操作系統(tǒng)就可能沒有足夠的內(nèi)存高效地完成計算機所必須的操作。在Init.ora 中通過調(diào)整DB_BLOCK_BUFFER 和LOG_BUFFER 的值,來改變SGA 的值。SGA 的值占整個內(nèi)存的50%左右較為理想。在Oracle 數(shù)據(jù)庫中有很多參數(shù)的設置是來定義物理存儲、資源利用的,這些參數(shù)設置得是否合適也就與系統(tǒng)的效率直接有關,參數(shù)的調(diào)整實際上就是要調(diào)整資源的利用效率 #p#page_title#e#
在運行時, 導致程序失敗的最常見的原因之一就是程序段的不可生長。這種不可生長可能是由于表空間中沒有足夠的空間來容納段的生長, 也可能是到達了MAXEXTENTS。到達MAXEXTENTS 可能會造成大量的浪費,并且它不容易引起人們的注意, 操作者可以考慮將MAXEXTENTS 的值設置的盡可能大。從Oracle7 開始,MAXEXTENTS 對DB_BLOCK_SIZE 的依賴性就被取消,從而使得MAXEXTENTS 可以按照需要進行設置,甚至可以將它設置為UNLIMITED。如果使用的是MAXEXTENTS,Oracle 將自動地把MAXEXTENTS 設置為249000000。通過此設置, 就能夠有效地阻止段由于到達擴展段的最大值而使應用程序因為不能接受更多數(shù)據(jù)而導致失敗。
參考文獻:
[1] Oracle數(shù)據(jù)庫應用系統(tǒng)的性能優(yōu)化 魏亞楠等 制造業(yè)自動化 2010
[2] Oracle數(shù)據(jù)庫性能優(yōu)化方法 李曉麗 軟件導刊 2010
[3]數(shù)據(jù)庫與應用之間的磨合劑—Oracle數(shù)據(jù)庫增值軟件談 白苗 程序員2009