當前位置:開發者網絡 >> 技術教程 >> 數據庫專欄 >> ORACLE >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
在Oracle9i中使用多種Block Size
作者:未知
日期:2005-04-29
人氣:
投稿:(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:

  Oracle9i為Oracle數據庫引擎帶來了一些令人吃驚的複雜性。它推出了許多新的內部特性,包括bitmap free lists,基於redo log的複製,動態SGA,還有一個可能是最重要的特性,可以支持多種塊大小(Block Size)。   當你忽略全部的高級特性時,Oracle的工作就是傳送數據,磁盤的I/O管理和調整對於任何的Oracle數據庫都是一個重要的部分。任何可以令磁盤I/O減少的工作都對Oracle數據庫系統有一個正面的影響。  如果我們查看一下各種各樣調整Oracle數據庫性能的方法,就會發現其實Oracle性能調整的共同目標都是減少磁盤的I/O。例如,調整一個SQL語句以除去一個全表搜索的操作可以令查詢運行得更快,因為這樣可以直接地減少需要由磁盤上讀取的數據塊。調整實例的參數,例如DB_CACHE_SIZE也可以減少磁盤的開銷。  要理解怎樣使用多種塊大小來提升Oracle數據庫的性能,我們首先查看一下磁盤I/O的基本特性。任何時候由磁盤上訪問一個Oracle數據塊時,我們通常會見到三種延遲。第一種也是最重要的延遲來源於讀-寫頭的移動時間。這個時間是指讀-寫頭需要將自己定位到正確的柱面所需要的時間。還有選擇延遲的時間,這是讀-寫頭等待相應的塊出現在它的下面,第三個延遲來源於將數據由磁盤傳回到Oracle SGA。  其實99%的延遲都是在真正訪問實際數據塊前發生的,那麼我們就可以知道讀取一個32K的塊所需要的時間其實和讀取一個2K大小的塊相差不大。也就是說,磁盤的延遲時間都是差不多的,它和塊的大小無關。因此我們可以得出這樣的結論:如果每次I/O都能夠讀取最大的塊,那麼Oracle數據庫所需要的整體I/O就會變少。  緩衝的原理並不是Oracle數據庫特有的。對於內存的訪問是以納秒計算的,而對磁盤的訪問通常是用毫秒計算的。如果我們可以將Oracle的數據塊都放入磁盤的緩衝中,性能將有著很大的提升。隨著Oracle的成熟和內存變得越來越便宜,我們將會發現Oracle數據庫的系統全局空間(SGA)的大小通常都超過10GB。這樣對於Oracle數據庫的性能有著很大的提升,因為在讀取時,Oracle數據塊都處在內存中,相對於需要由磁盤上得到數據塊,這樣將會快成千上萬倍。  內存緩衝中保留著Oracle訪問過的數據塊,在緩衝中的數據讀取速度要比由磁盤中讀取要快14,000倍。內存數據緩衝已經由Oracle7的單一緩衝發展為Oracle8i中的三個數據緩衝。它們的名字分別是KEEP pool,RECYCLE pool和 DEFAULT pool(如圖1所示)。****************圖一***************

  Oracle數據緩衝  在Oracle9i中我們仍然有三個數據緩衝,不過我們還可以為Oracle服務器支持的每個塊大小創建一個數據緩衝(如圖2所示)。************圖2-Oracle9i的8個數據緩衝*******  在每個數據緩衝中,由數據緩衝的命中率可以知道一個數據塊處在內存中的可能性。在數據緩衝間分配內存頁以確保內存緩衝的最優利用是Oracle管理員的工作。有時通過增加一些緩衝就有明顯的效果(見圖3)************圖三***************(增加到一個小的數據緩衝的內存頁)  隨著內存緩衝的增加,增加頁面帶來的好處就會下降(如圖4所示)。**************圖4***************  在大的數據緩衝下,由此而帶來的好處下降  索引和大的數據塊  在Oracle9i前,Oracle的專家發現通過將整個數據庫移植到更大的數據塊,可以減少磁盤的I/O,從而令整個系統的性能得到提升。由表面看來這有點不符合常理,人們可能會問"如果我只需要一個80字節的行,那麼讀取16K的塊又有什麼好處呢?"  這個問題的答案和索引有關。大部分經過很好地調優的Oracle數據庫都擁有和表數據差不多大小的索引。對於索引來說,大的數據塊無疑可以減少I/O,從而可以提升整個數據庫的性能。  所以,Oracle9i數據庫管理員要做的第一件事可能就是創建一個32K的表空間,一個相應的32K大小的數據緩衝,然後將他們系統中的全部索引移植到這個32K的表空間中。通過這樣,Oracle9i數據庫就可以在一次磁盤I/O中讀取相當數量的索引節點分枝,因此可以減輕系統的壓力並且提高總體的性能。

  將對像分配到多個塊緩衝中  通過這種方式,我們就可以在Oracle數據庫創建多個數據緩衝,那麼我們怎樣決定放些什麼數據到這些數據緩衝中呢?  讓我們先來看一些更常見的技巧。  隔離大表的全表搜索--對於要進行全表搜索的大表將會從最大的塊大小中得益,它們應該被放在使用最大塊大小的表空間。  仔細設置db_recycle_cache_size--如果你沒有為服務器設置db_cache_size到支持的最大塊大小,你將不應該使用db_recycle_cache_size參數。代替的是,你將要創建一個db_32k_cache_size(或者是你設置的最大值),並且將那些經常需要進行全表搜索的大表分配到最大的緩存中。  數據字典(Data Dictionary)使用默認的緩衝--你應該確保數據字典(例如你的SYSTEM表空間)經常全部緩衝到一個數據緩衝池中。要記住,確保SYSTEM表空間的數據緩衝擁有足夠的內存來緩衝全部的數據字典塊要比數據字典的塊大小重要。  隔離索引--在許多情況下,Oracle的SQL語句將會通過一個索引範圍搜索來得到索引的信息,根據SQL語句的條件,通過b樹或者bitmap索引來搜索一定範圍的值。因此,將盡量多的索引放到內存中是有好處的。Oracle 9i數據庫管理員首先要做的其中一件事情就是將他們全部的Oracle索引轉移到一個使用大的數據塊的表空間中,索引性能將會由大的塊中得到好處。  隔離隨機訪問讀取--對於那些由磁盤中隨機讀取很少行數的數據庫來說,Oracle DBA可以移動這些類型的表到一個2K的表空間中。我們要記住,雖然磁盤已經越來越便宜,但是這樣做會讀取一些與查詢無關的內容到內存中,這是我們不希望看到的。因此,對於小的、隨機訪問的表,Oracle DBA通常使用小的塊大小。  隔離LOB列的表--對於那些包含有raw, long raw或者in-line LOBs的表,將它們移動到大的數據塊中將會極大地提升磁盤I/O的性能。有經驗的DBA將會檢查dba_tables.avg_row_len來確保塊大小要比平均的行大。這樣將可以減少Row chaining的發生,同時整個LOB都可以在一次磁盤I/O中讀取,避免了Oracle必須讀取多個塊而帶來的開銷。  隔離全表搜索的大表--在Oracle8i中首次推出recycle pool,它的想法是全表搜索的數據塊通常都不會被其它事務重新讀取),從而可以將它們快速地由Oracle SGA中清除,這樣就可以將寶貴的內存用在那些有更大機會被其它事務重新讀取的數據塊上。在Oracle9i中,你可以設置recycle pool使用一個更小的塊大小。  檢查平均的行長--表空間的塊大小要比其中表的平均行長要大(dba_tables.avg_row_len)。如果它比平均行長小,這時就會發生rows chaining和過多的磁盤I/O。  使用大的塊作數據排序--你的TEMP表空間將會由最大支持的塊中受益。這樣磁盤排序句可以發生在大的塊中,從而減少磁盤I/O。  查看數據緩衝使用情況的工具  將Oracle對像放到獨立的數據緩衝中的過程是很簡單的,Oracle9i還提供了一些工具作輔助。許多Oracle的管理員都沒有意識到這些處於數據緩衝中的塊消耗一個不對稱的數據空間,而Oracle9i提供了大量的腳本來讓你查看哪些對象是經常處在數據緩衝中的。  以下的查詢是用來計算當前緩衝中的全部segment的塊數目。根據你的緩衝大小,這樣或者需要很多排序空間。column object_name format a40column number_of_blocks format 999,999,999,999column object_name format a40column number_of_blocks format 999,999,999,999SELECT  o.object_name,  COUNT(1) number_of_blocksFROM  DBA_OBJECTS o,  V$BH bhWHERE  o.object_id = bh.objdAND  o.owner != 'SYS'GROUP BY  o.object_nameORDER BY  count(1) desc;  以下讓我們看一下緩衝中的對象名和數據塊的數目OBJECT_NAME  NUMBER_OF_BLOCKS---------------------------------------- ----------------ORDER_TABLE   123,273ORDER_IDX    112,492CUSTOMER     83,272. . . OEM_EXT       701   創建獨立的數據緩衝  在Oracle9i中,將表或者索引塊分配到不同數據塊大小的表空間是很簡單的。在創建一個表空間時,我們會使用一個新的blocksize參數。在以下的例子中,我們在Oracle數據庫中創建了一個32K的表空間。create tablespace 32k_tablespacedatafile '/u01/oradata/mysid/32k_file.dbf'size 100Mblocksize  32k;  我們一旦創建了表空間,下一步是根據上面的blocksize來設置一個數據庫緩衝。要記住,Oracle 9i不再使用init.ora文件,所以我們要通過alter database語句來動態地創建帶名字的緩衝。alter system set db_2k_cache_size=200M; alter system set db_4k_cache_size=500M; alter system set db_8k_cache_size=800M; alter system set db_16k_cache_size=1600M;   一旦我們創建了帶名字的內存緩衝和表空間,我們就可以將Oracle對像轉移到新的表空間中。對於將對像由一個表空間轉移到另一個,有多種方法,而許多的Oracle管理員已經習慣使用create table as select or CTAS語法來移動表格。對於index,則可以使用alter index rebuild轉移到另一個表空間。  結論  對於Oracle9i的許多新特性,許多有經驗的DBA都認為塊的大小對於調整Oracle數據庫是最重要的。管理員現在可以使用多達7個獨立和不同的數據池,可以對每個數據對像使用的數據緩衝塊的數目進行更大的控制。通過考察不同的緩衝訪問特性,可以大大地減少磁盤I/O,從而極大地提高數據庫的性能。
相關文章: