程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORACLE數據庫性能優化之--)內存磁盤

ORACLE數據庫性能優化之--)內存磁盤

編輯: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,證明日志緩沖區還算比較合適的。

4,PGA調整

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性能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved