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