盡管Oracle系統(tǒng)本身已經(jīng)提供了若干種對系統(tǒng)性能進(jìn)行調(diào)節(jié)的技術(shù),但是,假如數(shù)據(jù)庫設(shè)計本身就有問題特別是在結(jié)構(gòu)上設(shè)計得尤其糟糕,那你縱有天大的本事又能奈何?因此,Oracle數(shù)據(jù)庫的設(shè)計者完全有必要弄清楚(從項目著手設(shè)計開始)該如何創(chuàng)建穩(wěn)固的Oracle數(shù)據(jù)結(jié)構(gòu),在保證可維護(hù)性和可擴(kuò)展性的同時以最快的速度從數(shù)據(jù)庫中獲取信息。
讓我們把籠罩在數(shù)據(jù)庫技術(shù)外圍的復(fù)雜理論和存心不讓人明白的技術(shù)行話扔一邊去,其實,說白了你就只需要記住一點,這也是牽扯到數(shù)據(jù)庫性能的最重要最簡單因素:磁盤I/O。磁盤I/O正是系統(tǒng)消耗的的Oracle數(shù)據(jù)庫操作。Oracle設(shè)計專家在設(shè)計數(shù)據(jù)體系結(jié)構(gòu)的時候務(wù)必記得:在獲取所需要的信息時一定要想盡辦法把磁盤訪問量降到最低!
本文提出了一些Oracle數(shù)據(jù)庫數(shù)據(jù)體系結(jié)構(gòu)設(shè)計方面的技巧,有了它們,在創(chuàng)造出易于維護(hù)和擴(kuò)展的設(shè)計方案同時還能讓數(shù)據(jù)庫保持在化的性能水準(zhǔn)之上。
結(jié)構(gòu)設(shè)計技巧
Oracle產(chǎn)品中有好些可以降低SQL查詢磁盤I/O量的工具。下面就是一些能極大改進(jìn)Oracle 系統(tǒng)性能的結(jié)構(gòu)設(shè)計問題。
采用多種大小尺度的數(shù)據(jù)塊
你完全可以故意地把不同的表和索引結(jié)構(gòu)映射到具有不同大小的表空間。這種分配方案的設(shè)計依據(jù)是表內(nèi)數(shù)據(jù)行的平均長度以及整個數(shù)據(jù)庫內(nèi)的數(shù)據(jù)訪問模式。Oracle9i給你提供了以下幾種選擇:2K、4K、16K甚至32K的表空間大小。這一招的實質(zhì)是讓表和索引僅需一次磁盤I/O就可以獲取所有關(guān)聯(lián)數(shù)據(jù)行的信息。
預(yù)先計算復(fù)雜的SQL查詢
Oracle提供了具體化的視圖和VARRAY表,通過它們就可以預(yù)建復(fù)雜的查詢并匯集到單行表內(nèi),這樣即時獲取信息可就快多了。即時匯集是一種優(yōu)異的Oracle設(shè)計。
采用內(nèi)存數(shù)據(jù)緩沖
你應(yīng)該知道Oracle9i允許開辟很大的內(nèi)存區(qū)域以便緩沖常用索引行的信息。常用索引信息的緩沖應(yīng)該是一個主要的專業(yè)設(shè)計目標(biāo),因為內(nèi)存訪問的速度可是磁盤訪問速度的至少1萬倍。Oracle數(shù)據(jù)塊緩沖區(qū)越大,SQL查詢的執(zhí)行速度就越快。內(nèi)存數(shù)據(jù)緩沖區(qū)的大小對Oracle的性能具有直接的影響,如果數(shù)據(jù)緩沖區(qū)緩沖了全部數(shù)據(jù)系統(tǒng)就可以達(dá)到最快的運(yùn)行速度。
購買更快的處理器
Oracle數(shù)據(jù)庫服務(wù)器的CPU速度對數(shù)據(jù)庫性能有直接影響。高性能64位CPU的運(yùn)行速度通常比32位處理器快10次。目前幾乎所有的主要平臺都可以采用64位處理器了,其中包括:
Windows―Intel安騰處理器
HP―PA-8000處理器
Solaris―500-MHz Ultrasparc-iie處理器
IBM AIX―RS/6000 PowerPC處理器
采用64位版本的Oracle
強(qiáng)烈建議你在裝備64位CPU體系結(jié)構(gòu)的專門服務(wù)器平臺上安裝和運(yùn)行64位的Oracle數(shù)據(jù)庫系統(tǒng)。Oracle的64位版本可以創(chuàng)建大規(guī)模的SGA區(qū)域以及通常需要超過20GB內(nèi)存數(shù)據(jù)緩沖區(qū)的大規(guī)模項目。32位Oracle數(shù)據(jù)庫的一個嚴(yán)重缺陷就是SGA只能開辟1.7GB
對索引使用大數(shù)據(jù)塊使磁盤I/O減到最小
Oracle索引訪問在Oracle數(shù)據(jù)庫大小為16K和32K的情況下性能表現(xiàn)。你應(yīng)該查詢相應(yīng)的應(yīng)用程序和操作系統(tǒng)文檔,為你的計算環(huán)境創(chuàng)建的索引表空間。
使用Oracle并行查詢
所有的數(shù)據(jù)訪問都應(yīng)該經(jīng)過調(diào)整避免大規(guī)模表掃描或者全表掃描,但在很多情況下都會有這樣的查詢要求,怎么辦呢?你不妨保證所有的全表掃描都充分利用了Oracle并行查詢機(jī)制以提高查詢性能。
選擇適當(dāng)?shù)腟QL優(yōu)化
優(yōu)化器模式的選擇對Oracle SQL性能具有關(guān)鍵的影響。對Oracle9i而言,所有查詢中大約有一半左右在基于規(guī)則的優(yōu)化條件下會運(yùn)行得更快一些;另外一半則在基于開銷的優(yōu)化條件運(yùn)行得最快。
包固定
所有經(jīng)常被引用的PL/SQL包都應(yīng)該使用dbms_shared_pool.keep過程固定到共享池。這樣做將極大地加快Oracle PL/SQL的執(zhí)行速度。
在存儲過程內(nèi)設(shè)計所有的數(shù)據(jù)訪問
最重要的設(shè)計問題之一把所有的數(shù)據(jù)庫訪問代碼都放到PL/SQL存儲過程中。
存儲過程設(shè)計技巧
Oracle設(shè)計目標(biāo)之一是盡可能地把所有Oracle處理代碼都封裝進(jìn)存儲過程。這樣做可以獲得相當(dāng)大的益處,主要同性能和可維護(hù)性有關(guān)。你應(yīng)該把自己的工作焦點置于這一目標(biāo)之上。
數(shù)據(jù)同行為耦合
許多數(shù)據(jù)庫管理員采用Oracle8的成員方法實現(xiàn)存儲過程與數(shù)據(jù)庫對象的緊密耦合。其它人則習(xí)慣于采用命名規(guī)范。例如,假設(shè)所有同customer表有關(guān)的行為都冠以該表的名字作為前綴(customer.hire、customer.give_raise等),那么你就可以查詢數(shù)據(jù)字典列出某表關(guān)聯(lián)的所有行為(select * from dba_objects where owner = 'CUSTOMER')而你能很容易地辨別和重用代碼。
代碼隔離
因為所有的SQL都從外部程序移入了存儲過程,所以應(yīng)用程序也就不外乎只涉及到對存儲過程的調(diào)用。正因如此,內(nèi)外交換某一個數(shù)據(jù)庫就很簡單了。
更快的SGA存取
存儲過程和觸發(fā)器函數(shù)的運(yùn)行速度為什么快于傳統(tǒng)數(shù)據(jù)庫操作代碼呢?主要原因要涉及到Oracle SGA。在一個過程被裝入SGA的共享池以后,它會一直“呆”到被調(diào)出內(nèi)存給其他存儲過程騰出空間為止。把過程調(diào)出內(nèi)存的原則就是所謂的LRU算法。一旦裝入了分享池的內(nèi)存區(qū),過程的執(zhí)行速度可就快多了,這里的花招就是想辦法阻止共享池承受太大的負(fù)載,因為許多存儲過程會競爭有限的共享池內(nèi)存量。再次重申:只要存儲過程裝入了共享池就要等到被調(diào)出內(nèi)存為止。連續(xù)的存儲過程執(zhí)行就比外部代碼更快。
小結(jié)
Oracle設(shè)計師的標(biāo)志之一就是有能力創(chuàng)造出穩(wěn)固、可維護(hù)和高效率的全面體系結(jié)構(gòu)。今天的 Oracle設(shè)計專家需要設(shè)計出能支持每秒數(shù)千宗交易的系統(tǒng)同時還能實現(xiàn)快速的響應(yīng)時間、簡易的維護(hù)以及可擴(kuò)展性。只要全面地了解Oracle9i 數(shù)據(jù)庫的特性,采用本文建議的技巧,你肯定能建立恰當(dāng)?shù)臄?shù)據(jù)模型結(jié)構(gòu)來支持最終用戶的需求。
讓我們把籠罩在數(shù)據(jù)庫技術(shù)外圍的復(fù)雜理論和存心不讓人明白的技術(shù)行話扔一邊去,其實,說白了你就只需要記住一點,這也是牽扯到數(shù)據(jù)庫性能的最重要最簡單因素:磁盤I/O。磁盤I/O正是系統(tǒng)消耗的的Oracle數(shù)據(jù)庫操作。Oracle設(shè)計專家在設(shè)計數(shù)據(jù)體系結(jié)構(gòu)的時候務(wù)必記得:在獲取所需要的信息時一定要想盡辦法把磁盤訪問量降到最低!
本文提出了一些Oracle數(shù)據(jù)庫數(shù)據(jù)體系結(jié)構(gòu)設(shè)計方面的技巧,有了它們,在創(chuàng)造出易于維護(hù)和擴(kuò)展的設(shè)計方案同時還能讓數(shù)據(jù)庫保持在化的性能水準(zhǔn)之上。
結(jié)構(gòu)設(shè)計技巧
Oracle產(chǎn)品中有好些可以降低SQL查詢磁盤I/O量的工具。下面就是一些能極大改進(jìn)Oracle 系統(tǒng)性能的結(jié)構(gòu)設(shè)計問題。
采用多種大小尺度的數(shù)據(jù)塊
你完全可以故意地把不同的表和索引結(jié)構(gòu)映射到具有不同大小的表空間。這種分配方案的設(shè)計依據(jù)是表內(nèi)數(shù)據(jù)行的平均長度以及整個數(shù)據(jù)庫內(nèi)的數(shù)據(jù)訪問模式。Oracle9i給你提供了以下幾種選擇:2K、4K、16K甚至32K的表空間大小。這一招的實質(zhì)是讓表和索引僅需一次磁盤I/O就可以獲取所有關(guān)聯(lián)數(shù)據(jù)行的信息。
預(yù)先計算復(fù)雜的SQL查詢
Oracle提供了具體化的視圖和VARRAY表,通過它們就可以預(yù)建復(fù)雜的查詢并匯集到單行表內(nèi),這樣即時獲取信息可就快多了。即時匯集是一種優(yōu)異的Oracle設(shè)計。
采用內(nèi)存數(shù)據(jù)緩沖
你應(yīng)該知道Oracle9i允許開辟很大的內(nèi)存區(qū)域以便緩沖常用索引行的信息。常用索引信息的緩沖應(yīng)該是一個主要的專業(yè)設(shè)計目標(biāo),因為內(nèi)存訪問的速度可是磁盤訪問速度的至少1萬倍。Oracle數(shù)據(jù)塊緩沖區(qū)越大,SQL查詢的執(zhí)行速度就越快。內(nèi)存數(shù)據(jù)緩沖區(qū)的大小對Oracle的性能具有直接的影響,如果數(shù)據(jù)緩沖區(qū)緩沖了全部數(shù)據(jù)系統(tǒng)就可以達(dá)到最快的運(yùn)行速度。
購買更快的處理器
Oracle數(shù)據(jù)庫服務(wù)器的CPU速度對數(shù)據(jù)庫性能有直接影響。高性能64位CPU的運(yùn)行速度通常比32位處理器快10次。目前幾乎所有的主要平臺都可以采用64位處理器了,其中包括:
Windows―Intel安騰處理器
HP―PA-8000處理器
Solaris―500-MHz Ultrasparc-iie處理器
IBM AIX―RS/6000 PowerPC處理器
采用64位版本的Oracle
強(qiáng)烈建議你在裝備64位CPU體系結(jié)構(gòu)的專門服務(wù)器平臺上安裝和運(yùn)行64位的Oracle數(shù)據(jù)庫系統(tǒng)。Oracle的64位版本可以創(chuàng)建大規(guī)模的SGA區(qū)域以及通常需要超過20GB內(nèi)存數(shù)據(jù)緩沖區(qū)的大規(guī)模項目。32位Oracle數(shù)據(jù)庫的一個嚴(yán)重缺陷就是SGA只能開辟1.7GB
對索引使用大數(shù)據(jù)塊使磁盤I/O減到最小
Oracle索引訪問在Oracle數(shù)據(jù)庫大小為16K和32K的情況下性能表現(xiàn)。你應(yīng)該查詢相應(yīng)的應(yīng)用程序和操作系統(tǒng)文檔,為你的計算環(huán)境創(chuàng)建的索引表空間。
使用Oracle并行查詢
所有的數(shù)據(jù)訪問都應(yīng)該經(jīng)過調(diào)整避免大規(guī)模表掃描或者全表掃描,但在很多情況下都會有這樣的查詢要求,怎么辦呢?你不妨保證所有的全表掃描都充分利用了Oracle并行查詢機(jī)制以提高查詢性能。
選擇適當(dāng)?shù)腟QL優(yōu)化
優(yōu)化器模式的選擇對Oracle SQL性能具有關(guān)鍵的影響。對Oracle9i而言,所有查詢中大約有一半左右在基于規(guī)則的優(yōu)化條件下會運(yùn)行得更快一些;另外一半則在基于開銷的優(yōu)化條件運(yùn)行得最快。
包固定
所有經(jīng)常被引用的PL/SQL包都應(yīng)該使用dbms_shared_pool.keep過程固定到共享池。這樣做將極大地加快Oracle PL/SQL的執(zhí)行速度。
在存儲過程內(nèi)設(shè)計所有的數(shù)據(jù)訪問
最重要的設(shè)計問題之一把所有的數(shù)據(jù)庫訪問代碼都放到PL/SQL存儲過程中。
存儲過程設(shè)計技巧
Oracle設(shè)計目標(biāo)之一是盡可能地把所有Oracle處理代碼都封裝進(jìn)存儲過程。這樣做可以獲得相當(dāng)大的益處,主要同性能和可維護(hù)性有關(guān)。你應(yīng)該把自己的工作焦點置于這一目標(biāo)之上。
數(shù)據(jù)同行為耦合
許多數(shù)據(jù)庫管理員采用Oracle8的成員方法實現(xiàn)存儲過程與數(shù)據(jù)庫對象的緊密耦合。其它人則習(xí)慣于采用命名規(guī)范。例如,假設(shè)所有同customer表有關(guān)的行為都冠以該表的名字作為前綴(customer.hire、customer.give_raise等),那么你就可以查詢數(shù)據(jù)字典列出某表關(guān)聯(lián)的所有行為(select * from dba_objects where owner = 'CUSTOMER')而你能很容易地辨別和重用代碼。
代碼隔離
因為所有的SQL都從外部程序移入了存儲過程,所以應(yīng)用程序也就不外乎只涉及到對存儲過程的調(diào)用。正因如此,內(nèi)外交換某一個數(shù)據(jù)庫就很簡單了。
更快的SGA存取
存儲過程和觸發(fā)器函數(shù)的運(yùn)行速度為什么快于傳統(tǒng)數(shù)據(jù)庫操作代碼呢?主要原因要涉及到Oracle SGA。在一個過程被裝入SGA的共享池以后,它會一直“呆”到被調(diào)出內(nèi)存給其他存儲過程騰出空間為止。把過程調(diào)出內(nèi)存的原則就是所謂的LRU算法。一旦裝入了分享池的內(nèi)存區(qū),過程的執(zhí)行速度可就快多了,這里的花招就是想辦法阻止共享池承受太大的負(fù)載,因為許多存儲過程會競爭有限的共享池內(nèi)存量。再次重申:只要存儲過程裝入了共享池就要等到被調(diào)出內(nèi)存為止。連續(xù)的存儲過程執(zhí)行就比外部代碼更快。
小結(jié)
Oracle設(shè)計師的標(biāo)志之一就是有能力創(chuàng)造出穩(wěn)固、可維護(hù)和高效率的全面體系結(jié)構(gòu)。今天的 Oracle設(shè)計專家需要設(shè)計出能支持每秒數(shù)千宗交易的系統(tǒng)同時還能實現(xiàn)快速的響應(yīng)時間、簡易的維護(hù)以及可擴(kuò)展性。只要全面地了解Oracle9i 數(shù)據(jù)庫的特性,采用本文建議的技巧,你肯定能建立恰當(dāng)?shù)臄?shù)據(jù)模型結(jié)構(gòu)來支持最終用戶的需求。

