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