1. 程式人生 > >ORACLE資料庫效能優化之-->記憶體磁碟

ORACLE資料庫效能優化之-->記憶體磁碟

1,記憶體結構優化概述

1.1 緩衝區

影響資料庫執行效能的緩衝區包括可以共享的SGA和伺服器程序私有的pga兩大類,其中sga又包括共享池、大型池、java池、資料緩衝區、流池、redo log緩衝區。

1.2 自動記憶體管理

oracle一般採用自動記憶體管理來管理系統記憶體,由oracle自動管理和調整資料庫例項的記憶體大小。在自動管理模式下,首先對初始化引數MEMORY_TARGET(目標記憶體大小)和MEMORY_MAX_TARGET(最大記憶體大小)進行配置,資料庫調整目標記憶體大小,根據需要不斷重新調整sga和pga的緩衝區大小。

1.3 共享記憶體sga的自動管理

如果資料庫例項啟動時候動態將初始化引數SGA_TARGET設定為0,則自動共享記憶體管理被禁止使用。每個緩衝區的大小由初始化引數檔案中的相應引數來決定。如果有必要,可以通過手動設定初始化引數DB_CACHE_SIZE,SHARED_POOL_SIZE,LARGE_POOL_SIZE,JAVA_POOL_SIZE,STREAMS_POOL_SIZE,來調整共享記憶體區各個緩衝區的大小。一般通常有一些記憶體元件大小需要管理員手動設定,不受自動記憶體管理的影響,比如重做日誌緩衝區;KEEP、RECYCLE以及基於非標準資料塊的緩衝區;固定的SGA和其他內部分配的記憶體區。手動調整這些記憶體區時候,需要設定的初始化引數有DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE,DB_nK_CACHE_SIZE,LOG_BUFFER,這些記憶體區的分配都是從SGA_TARGET指定記憶體中獲取,SGA_TARGET的餘下部分供自動共享記憶體管理的各個緩衝區使用。

1.4 動態改變緩衝區大小

如果系統沒有采用自動記憶體管理或者自動記憶體共享記憶體管理功能,可以使用ALTER SYSTEM語句配置初始化引數DB_ACHE_SIZE,JAVA_POOL_SIZE,LARGE_POOL_SIZE,LOG_BUFFER,SHARED_POOL_SIZE等。

2,資料緩衝區調整

通過下列兩種方式檢查資料緩衝區設定是否合理:

檢視資料庫緩衝區的命中率,執行命令:

 select 1 - ((physical.value - direct.value -lobs.value) / logical.value)

 "Buffer Cache Hit Ratio"

 from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstatlogical

 where physical.name = 'physical reads'

  anddirect.name='physical reads direct'

  andlobs.name='physical reads direct (lob)'

  andlogical.name='session logical reads';

 執行結果:

SQL> select 1 - ((physical.value - direct.value - lobs.value) /logical.value)

 2    "Buffer Cache HitRatio"

 3    from v$sysstatphysical,v$sysstat direct,v$sysstat lobs,v$sysstat logical

 4    where physical.name ='physical reads'

 5    and direct.name='physicalreads direct'

 6    and lobs.name='physical readsdirect (lob)'

 7    and logical.name='sessionlogical reads';

Buffer Cache Hit Ratio

----------------------

    0.958117758479709

SQL>

慣例來說,上述語句當>0.9實說明調整充分的。命中率是高的,這裡已經為0.95,所以命中率還是比較可觀的。對於資料庫系統而言,資料緩衝區中包括的DEFAULT緩衝池就足夠應用需要了。

查詢資料緩衝區中每個緩衝區的邏輯讀和物理讀的資訊,可以查詢動態效能檢視v$buffer_pool_statistics,例如:

SQL> selectt1.name,t1.PHYSICAL_READS,t1.DB_BLOCK_GETS,t1.CONSISTENT_GETS,1-(t1.PHYSICAL_READS/(t1.DB_BLOCK_GETS+t1.CONSISTENT_GETS))"Hit Ratio"

 2  from v$buffer_pool_statisticst1

 3  ;

NAME                 PHYSICAL_READS DB_BLOCK_GETSCONSISTENT_GETS  Hit Ratio

-------------------- --------------------------- --------------- ----------

DEFAULT                 44480354387     571096618     33595740186 -0.3018575

SQL>

調整資料緩衝區大小

如果資料緩衝區小於90%,就要考慮調整資料緩衝區大小。增大資料緩衝區之前,先看看V$DB_CACHE_SIZE(select * from v$db_cache_advice),確定資料緩衝區增大到多少能夠顯著降低物理I/O的數量,然後動態修改初始化引數DB_CACHE_SIZE。初始化引數DB_CACHE_SIZE對應的是標準資料緩衝區大小,如果要修改非標準的資料緩衝區大小,需要修改初始化引數DB_nK_CACHE_SIZE(n取值為2、4、8、16、32,且n不能是標準資料塊大小)

3,共享池調整

3.1 庫快取命中率

可以通過查詢動態效能檢視v$librarycache(select * from v$librarycache;),該檢視儲存了資料庫最近一次啟動以來庫快取活動的統計資訊,每一行記錄反映了庫快取中一個條目型別的統計資訊,通過namespace列值來識別每個條目型別。例如:

selectt1.NAMESPACE,t1.PINS,t1.PINHITS,t1.RELOADS,t1.INVALIDATIONS from v$librarycachet1 order by t1.NAMESPACE;

SQL> selectt1.NAMESPACE,t1.PINS,t1.PINHITS,t1.RELOADS,t1.INVALIDATIONS from v$librarycachet1 order by t1.NAMESPACE;

NAMESPACE                                                             PINS    PINHITS    RELOADS INVALIDATIONS

-------------------------------------------------------------------------- ---------- ---------- -------------

APP CONTEXT                                                               2          1          0             0

BODY                                                              28468616   28458242       1818            46

CLUSTER                                                             114902     114198          0             0

DBINSTANCE                                                               0          0          0             0

DBLINK                                                                   0          0          0            0

DIRECTORY                                                              371         81          0             0

EDITION                                                           10577860   10577856          0             0

INDEX                                                                403451     315690     11194             0

JAVA DATA                                                             3161       1876          0             0

JAVA RESOURCE                                                          3413       2124          0             0

JAVA SOURCE                                                           3413       2121          0             0

OBJECT ID                                                                0          0          0             0

PIPE                                                                  2940       2936          0             0

QUEUE                                                               755296     754776        218             0

RULE                                                                    732        365         82             0

RULESET                                                              18358      17693         26             0

SCHEMA                                                                    0          0          0             0

SQL AREA                                                        1252576540 1223849814   1430167        926624

SUBSCRIPTION                                                         50182      49948          6             0

TABLE/PROCEDURE                                                  162038767  161228629     429539           263

NAMESPACE                                                             PINS    PINHITS    RELOADS INVALIDATIONS

-------------------------------------------------------------------------- ---------- ---------- -------------

TEMPORARY INDEX                                                      25602          0       7514             0

TEMPORARY TABLE                                                       70046          0     55020             0

TRIGGER                                                           12753767   12747803       1146             0

XDB CONFIG                                                                1          0          0             0

XML SCHEMA                                                              27          6          4             0

25 rows selected

SQL>

PINS:針對特定NAMESPACE的物件請求次數

PINHITS:針對特定NAMESPACE的物件請求次數,在庫快取中存在的次數

RELOADS:需要從磁碟中載入物件的次數

INVALIDATIONS:針對特定的namespace,由於依賴物件的改變而被標識為失敗的物件的次數。

庫快取命中率的計算公式(sum(t1.PINHITS)/sum(pins)計算),例如:

SQL> select sum(t1.PINHITS)/sum(pins)"Lib Ratio" from v$librarycache t1;

 LibRatio

----------

0.97973692

SQL>

也可以查詢動態效能檢視v$sgastat來獲取共享池空閒記憶體的數量。例如:

SQL> select t1.* from v$sgastat t1 wheret1.NAME='free money' and pool='shared pool';

POOL        NAME                           BYTES

------------ ------------------------------------

SQL>

看到awr報表中

3.2 資料字典快取命中率

通常,如果共享池中庫快取空間充足,那麼資料字典快取也會充足,在某些情況下,資料緩會失敗,比如在資料庫例項剛啟動的時候,資料庫字典快取不包含任何資料,任何sql語句的執行都會導致資料字典快取失敗,而隨著資料快取字典的增多,快取失敗將較少,最後將達到一個穩定的命中率,此時資料字典快取失敗率將非常低。

可以通過查詢資料庫動態效能檢視v$rowcache(select * from v$rowcache;)獲取不同型別資料字典條目的統計資訊。這裡反應了從最近一次資料庫啟動以來資料字典的使用情況。

SQL> selectt1.PARAMETER,sum(t1.GETS),sum(t1.GETMISSES),100*sum(t1.GETS-t1.GETMISSES)/sum(t1.GETS)pct_succ_gets,sum(t1.MODIFICATIONS)updates from v$rowcache t1 where t1.GETS!=0group by t1.PARAMETER;

PARAMETER                        SUM(T1.GETS)SUM(T1.GETMISSES) PCT_SUCC_GETS   UPDATES

-------------------------------------------- ----------------- ------------- ----------

dc_constraints                          39950             16050 59.8247809762      39942

qmc_app_cache_entries                       1                 1             0          0

sch_lj_oids                             33696              1452 95.6908831908          0

dc_tablespaces                      994784326                74 99.9999925612          2

dc_awr_control                         271427                 3 99.9988947304       6322

dc_object_grants                     41203543              6097 99.9852027288          0

dc_histogram_data                   649621988           1065618 99.8359633725    1069946

dc_rollback_segments                 25496538               235 99.9990783062        825

dc_sequences                           156506              1536 99.0185679782     156506

sch_lj_objs                              4018               796 80.1891488302          0

dc_segments                         130394426            139507 99.8930115310      77938

dc_objects                          225599535            310991 99.8621490952      96415

dc_histogram_defs                   217299674           1852549 99.1474681181     646908

dc_table_scns                            4801              4801             0          0

dc_users                           1300331635             10744 99.9991737492        789

qmtmrcin_cache_entries                      1                 1             0          0

outstanding_alerts                     413246              2893 99.2999327277       6092

dc_files                                36345                49 99.8651809052          6

dc_global_oids                       28777369              6959 99.9758178032        235

dc_profiles                           5282207                 1 99.9999810685          0

PARAMETER                        SUM(T1.GETS)SUM(T1.GETMISSES) PCT_SUCC_GETS   UPDATES

-------------------------------------------- ----------------- ------------- ----------

global database name                 12620366                16 99.9998732207          0

qmtmrctn_cache_entries                     13                13             0          0

qmtmrciq_cache_entries                      1                 1             0          0

qmtmrctq_cache_entries                    586               585 0.17064846416          0

qmrc_cache_entries                          7                 7             0          0

25 rows selected

SQL>

PARAMETER:標識一個特定型別的資料字典條目,以dc_為字首。

GETS:對特性資料字典條目請求的資料總數量

GETMISSES:顯示由於資料字典快取失敗,需要進行磁碟I/O操作的資料的數量

MODIFICATIONS:顯示資料字典快取中資料被更新的次數

3.3 共享池大小的調整

通常情況下,庫快取命中率應該高於99%,而資料字典快取命中率應該高於90%,否則需要調整共享池大小了。因為庫快取的大小和資料字典快取大小沒有單獨設定,而是oracle自動按照一定的演算法在共享池中分配,按照oracle中的記憶體空間分配演算法,如果庫快取命中率高,那麼資料字典快取命中率也會很高。

3.4 重做日誌緩衝區調整

重做日誌緩衝區用於存放資料的修改資訊,重做日誌首先寫入重做日誌緩衝區,在一定條件下由LGWR程序將重做緩衝區的資訊寫入重做日誌檔案;如果重做日誌緩衝區容量較大,即可以保證有足夠空間儲存新產生的重做記錄,又可以為LGWR程序高效寫入重做日誌檔案提供了條件;如果重做日誌緩衝區已經滿了,沒有空間容納新的重做日誌記錄,新產生的重做日誌記錄處於waiting狀態,稱為重做日誌緩衝區寫入失敗。過多的重做日誌寫入失敗,說明重做日誌緩衝區偏小,影響資料庫效能。

可以通過如下方式檢查重做日誌緩衝區寫入失敗率。

select t1.NAME"request",t2.NAME,t1.VALUE/t2.VALUE "Fail Ratio"

from v$sysstat t1,v$sysstat t2

where t1.name='redo log space requests' andt2.NAME='redo entries';

結果如下:

SQL> select t1.NAME"request",t2.NAME,t1.VALUE/t2.VALUE "Fail Ratio"

 2  from v$sysstat t1,v$sysstat t2

 3  where t1.name='redo log spacerequests' and t2.NAME='redo entries';

request                                                         NAME                                                            Fail Ratio

-------------------------------------------------------------------------------------------------------------------------------- ----------

redo log space requests                                          redoentries                                                    0.00355035

SQL>

通常日誌緩衝區的寫入失敗率應該接近於0,如果失敗率大於1%,則說明日誌緩衝區太小,應該增加LOG_BUFFER的大小。

看到寫入失敗率為0.003,遠遠小於1,證明日誌緩衝區還算比較合適的。

4PGA調整

PGA是存放伺服器程序私有的資料和控制資訊的記憶體區域,每個伺服器程序只能訪問自己的PGA區。在PGA區中可以包括一下這些工作區。

通常情況下,可以先將引數PGA_AGGREGATE_TARGET的值設定為SGA的20%,然後再資料庫中執行有代表性的工作負荷、統計、檢查PGA執行情況,並進行適當調整。

在oracle資料庫中,排序可以在pga的排序區和臨時表空間的臨時段中進行排序。由於使用臨時段需要對磁碟進行io操作,會降低排序的效率,因此oracle建議儘量在排序區進行排序操作。

根據資料在排序區的排序量和磁碟排序量,可以計算出排序區排序命中率,

select memory1.NAME "memorysort",disk1.name "disk sort", (1-disk1.value/memory1.value)*100"HitRatio"

from v$sysstat memory1, v$sysstat disk1

where memory1.NAME='sorts (memory)' anddisk1.NAME='sorts (disk)';

結果如下:

SQL> select memory1.NAME "memorysort",disk1.name "disk sort", (1-disk1.value/memory1.value)*100"HitRatio"

 2  from v$sysstat memory1,v$sysstat disk1

 3  where memory1.NAME='sorts(memory)' and disk1.NAME='sorts (disk)'

 4  ;

memory sort                                                     disk sort                                                         HitRatio

-------------------------------------------------------------------------------------------------------------------------------- ----------

sorts (memory)                                                  sorts (disk)                                                    99.9999420

SQL>

正常情況下,排序區的命中率應該高於95%,即保證絕大多數的排序操作在記憶體中進行,否則,就應該調整排序區大小,即增加SORT_AREA_SIZE的大小。從這裡看到命中率為99.99還是合適的。

5,資料庫碎片整理

5.1 表空間碎片整理

         檢視每個表空間的大小:SelectTablespace_Name,Sum(bytes)/1024/1024 From Dba_Segments Group By Tablespace_Name

         檢視剩餘表空間大小:SELECTtablespace_name 表空間,sum(blocks*8192/1000000) 剩餘空間M FROMdba_free_space GROUP BY tablespace_name;

  表空間級碎片是由於段的建立、擴充套件和刪除引起的。

  可以採用2種方案來操作

  1是altertablespace PLCRM coalesce命令來。

 SQL> alter tablespace PLCRM coalesce;

         Tablespacealtered.

         SQL>

   2是先通過export程式將資料匯出,然後利用truncate刪除表中的資料,最後用import將資料匯入即可。

5.2 整理表的碎片空閒

         分配給表的物理空間數量:SelectSegment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name;

         實際使用的空間:selectnum_rows * avg_row_len from user_tables where table_name = 'EMP';

         回收表的空閒空間:altertable tablename deallocate unused;

5.3 索引碎片整理

         (1). recreateindex

         (2). alterindex skate.idx_test rebuild nologging parallel 4 online ;

         (3). 如果葉塊是half-emptyor near empty,可以執行“alter index coalesce”來合併

6 磁碟I/O優化與調整

         可以按照以下規律進行整理

         (1)資料庫的物理檔案,包括資料檔案日誌檔案以及控制檔案,儘量分散到不同磁碟上,避免相互之間的磁碟競爭,同時還可以實現均衡磁碟負載。

         (2)將同一個表空間的資料檔案儘量平均分配到不同的磁碟上,實現磁碟之間的負載均衡。

         (3)儘量將所有的日誌檔案分散到不同的磁碟上面,減少日誌檔案對磁碟的競爭。

         (4)儘量將表和索引分散到不同的表空間,將表資料和索引資料儲存到不同的磁碟,減少資料檔案和索引檔案對磁碟的競爭。

         (5)為不同的應用建立不同的表空間,並將表空間所對應的資料檔案存放到不同的磁碟,減少不同應用之間的磁碟競爭。

         (6)系統表空間system不要分配給其它應用使用,建設db系統與ing呀之間的磁碟競爭。

         (7)建立撤銷表空間用於非系統回滾段的管理,防止磁碟競爭影響事務的完成。

         (8)表空間的管理儘量採用本地管理方式,儲存空間的分配採用自動管理,儘量避免碎片的產生以及行連線、行遷移的出現。

         (9)根據表的特點以及資料量大小等,採用分割槽表、分割槽索引、索引優化表、聚簇等結構,合理地將資料分散到不同的資料檔案中,提供系統的I/O效能。