仔細設置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,從而極大地提高數據庫的性能。