文/黃杰生
影響數(shù)據(jù)庫性能的包括邏輯因素和物理因素,無論哪方面出現(xiàn)問題,都會導致數(shù)據(jù)庫性能降低。為確保數(shù)據(jù)庫能提供快速穩(wěn)定的數(shù)據(jù)存儲和應用服務,必須重視數(shù)據(jù)庫的性能優(yōu)化。在數(shù)據(jù)庫設計階段同步考慮數(shù)據(jù)庫性能問題,對數(shù)據(jù)庫的邏輯架構(gòu)與物理架構(gòu)進行合理優(yōu)化設計,將對數(shù)據(jù)庫性能的增強具有重要作用。
ORACLE是一種優(yōu)秀先進的關(guān)系型數(shù)據(jù)庫,具有強大的數(shù)據(jù)存儲及管理功能,具有很高的市場占有率 。ORACLE主要使用SQL語言作為數(shù)據(jù)管理與應用開發(fā)的接口,系統(tǒng)可在Unix、Windows多平臺上運行,具有功能強大、穩(wěn)定性好、兼容性強、維護效率高等優(yōu)點。但由于ORACLE十分龐大和復雜,如果在數(shù)據(jù)庫設計和使用的時候不合理,都會導致嚴重的性能問題。
ORACLE數(shù)據(jù)庫架構(gòu)主要包括邏輯架構(gòu)與物理架構(gòu),分別面向兩種架構(gòu)的若干主要性能優(yōu)化設計方法如下:
2.1.1數(shù)據(jù)庫表設計
設計庫表前應嘗試預估存放的數(shù)據(jù)量,并分配足夠大的初始擴展區(qū)(INITIAL EXTENTS)來存放全表。但如果需要使用并行查詢機制,則應該使用多個數(shù)據(jù)文件分布存放全表數(shù)據(jù),并注意使每次分配的擴展區(qū)數(shù)目與并行度相等。對于超過1G大小或超過1千萬條數(shù)據(jù)的庫表可設計為分區(qū)表(partitioned table)。
考慮創(chuàng)建多個表空間,每個表空間用于存放不同類型或大小的數(shù)據(jù)表,實現(xiàn)表空間負載的合理均衡利用。盡量保證INITIAL和NEXT擴展區(qū)的大小是相同大小的單元的整數(shù)倍,比如128K的整數(shù)倍,這樣可以保持擴展區(qū)的統(tǒng)一大小,而且不會造成表空間碎片。表空間碎片會導致很多無法利用的小擴展區(qū)分散在表空間中,引起額外的性能開銷。
2.1.2有效利用索引
正確使用索引可以使數(shù)據(jù)庫性能得到大幅提高,因此根據(jù)不同場景需要合理建立并利用不同類型的索引,使數(shù)據(jù)訪問性能最優(yōu)。可參照如下指引使用索引:
(1)索引信息存放在一個單獨的表空間,并確保該表空間的數(shù)據(jù)文件與索引對應的庫表的表空間的數(shù)據(jù)文件不在同一磁盤上。
(2)對where條件語句中高頻出現(xiàn)的字段建立索引,同時注意索引應建立在小字段上,對于大文本字段甚至超長字段,不要建立索引。
(3)當where條件中經(jīng)常出現(xiàn)多個選擇字段時,可選擇區(qū)分度高的字段進行組合創(chuàng)建復合索引,但不宜超過3個字段。
(4)索引包含了庫表所有字段時,可直接將表數(shù)據(jù)存放在索引塊中,構(gòu)成唯一索引表(index-only table)。
(5)被索引的列數(shù)據(jù)具有低基數(shù)(cardinality)時(即索引列具有相對較少的確定值),通過創(chuàng)建位圖索引(bitmap index)可大幅改善性能。
(6)若對某個表字段的操作全是固定函數(shù)操作,不是原始操作,可考慮建立函數(shù)索引。
(7)對于需要經(jīng)常與其他庫表進行連接的庫表,在連接字段上應建立索引。
(8)通過定時任務定期重建索引,減少索引碎片。
2.1.3內(nèi)存優(yōu)化
對系統(tǒng)全局區(qū)(SGA)進行合理配置。系統(tǒng)全局區(qū)包括四個部分:數(shù)據(jù)緩沖區(qū);共享池;重做日志緩沖區(qū);大型共享池。其中數(shù)據(jù)緩沖區(qū)和共享池是SGA的兩個最重要的優(yōu)化區(qū)域。在系統(tǒng)內(nèi)存足夠時,增大參數(shù)DB_BLOCK_BUFFERS的值可以提高訪問數(shù)據(jù)緩沖區(qū)的性能;增大參數(shù)SHARED_POOL_SIZE的值可以提高訪問數(shù)據(jù)字典及共享SQL和PL/SQL語句的性能。
Oracle在執(zhí)行類似建立索引和執(zhí)行帶子句的查詢(例如Order By)的操作時,需要內(nèi)存空間來對數(shù)據(jù)進行排序,合理配置SORT_AREA_RESERVED_SIZE和SORT_AREA_SIZE參數(shù)不僅能明顯提高需要排序的查詢性能,而且還能釋放I/O帶寬等系統(tǒng)資源,從而提高性能。
另外,為日志(redo log)緩沖區(qū)分配更多的內(nèi)存,也可有效減少磁盤I/O,特別是對于事務特別長或事物數(shù)量較多的OLTP數(shù)據(jù)庫,性能提升效果顯著。
2.2.1磁盤讀寫能力的優(yōu)化
ORACLE存儲與訪問數(shù)據(jù)非常依賴磁盤訪問,而磁盤訪問是任何計算機系統(tǒng)上最慢的操作,是性能的最大瓶頸,可參照以下指引進行優(yōu)化:
(1)盡量將輸入/輸出操作分離到不同的磁盤上,避免串行等待。例如回滾段和日志文件在同一磁盤上的話,會導致寫完回滾記錄再將磁盤磁頭移動至日志文件存放的部分,非常耗時。
(2)把高輸入/輸出的磁盤放在不同的控制器上。單個控制器可以處理有限的并發(fā)操作,但應該盡可能利用更多的控制器提高并行度,消除等候時間。
(3)把操作最頻繁的數(shù)據(jù)庫對象(如日志文件、回滾段、索引表空間)放在速度最快的磁盤上。
(4)通過RAID-0+1技術(shù)實現(xiàn)ORACLE條帶化,既可消除等待磁盤頭定位的延遲,也可通過磁盤鏡像實現(xiàn)數(shù)據(jù)保護,特別在多CPU并行查詢的情況下,能充分發(fā)揮硬件潛力。
2.2.2基礎(chǔ)運行環(huán)境優(yōu)化
(1)應充分利用物理內(nèi)存,但同時應避免過多交換(swapping)發(fā)生,因為將內(nèi)存交換到磁盤的過程非常緩慢。對于系統(tǒng)全局區(qū)(SGA)的大小應合理控制,切勿占據(jù)過多物理內(nèi)存,否則會引起過多SGA交換,會嚴重降低ORACLE性能。
(2)盡量用主干專用網(wǎng)絡將服務器連接在一起,并盡量將服務器-服務器的通信與服務器-客戶端的通信分離。
(3)盡量將ORACLE數(shù)據(jù)庫部署在單獨的機器上,與其他服務系統(tǒng)分離。
為驗證數(shù)據(jù)庫性能的優(yōu)化設計效果,本文以一張記錄數(shù)200萬、占用空間500M的單表為對象,對其進行不同方法優(yōu)化后再對其執(zhí)行相同查詢語句的時間進行了對比觀察,驗證結(jié)果如下:
(1)未作任何優(yōu)化時,執(zhí)行時間為21.7s。
(2)索引建立后,執(zhí)行時間為10.4s。(3)表結(jié)構(gòu)優(yōu)化后,執(zhí)行時間為6.7s。(4)讀寫優(yōu)化后,執(zhí)行時間為4.0s。(5)綜合優(yōu)化后,執(zhí)行時間下降到了2.4s。
綜上所述,本文以ORACLE數(shù)據(jù)庫為研究對象,從數(shù)據(jù)庫表設計、索引利用、內(nèi)存配置、磁盤讀寫能力、基礎(chǔ)環(huán)境等方面進行了性能優(yōu)化設計,使查詢執(zhí)行時間得到了明顯的降低,數(shù)據(jù)庫性能得到明顯提升,證實了優(yōu)化方法的有效性,為數(shù)據(jù)庫管理與應用工作提供了指引。