在Oracle9i中使用多種Block Size

來源:互聯網
上載者:User

  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 a40
column number_of_blocks format 999,999,999,999

column object_name format a40
column number_of_blocks format 999,999,999,999

SELECT
 o.object_name,
 COUNT(1) number_of_blocks
FROM
 DBA_OBJECTS o,
 V$BH bh
WHERE
 o.object_id = bh.objd
AND
 o.owner != 'SYS'
GROUP BY
 o.object_name
ORDER BY
 count(1) desc;

  以下讓我們看一下緩衝中的對象名和資料區塊的數目


OBJECT_NAME  NUMBER_OF_BLOCKS
---------------------------------------- ----------------
ORDER_TABLE   123,273
ORDER_IDX    112,492
CUSTOMER     83,272
. . .
OEM_EXT       701

  建立獨立的資料緩衝

  在Oracle9i中,將表或者索引塊分配到不同資料區塊大小的資料表空間是很簡單的。在建立一個資料表空間時,我們會使用一個新的blocksize參數。在以下的例子中,我們在Oracle資料庫中建立了一個32K的資料表空間。


create tablespace
 32k_tablespace
datafile
 '/u01/oradata/mysid/32k_file.dbf'
size
 100M
blocksize
 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,從而極大地提高資料庫的效能。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.