Oracle有很多值得學習的地方,這裡我們主要介紹Oracle數據庫對象,包括介紹Oracle實例等方面。每一個Oracle實例都是由一組Oracle後台進程和SGA的一個內存區組成的。這組後台進程會自動的讀寫數據庫的數據文件,數據庫性能可以被這些因素所影響:
◆SGA各部分的分配是否合理,使用效率是否正常;
◆I/O和鎖競爭是否較多。
1.SGA的分配及使用效率
分配給每個實例的內存,即SGA的使用效率如何,會大大影響數據庫系統的性能。SGA由下列部分組成:共享池、數據塊緩沖區、重做日志緩沖區、大池組成。
共享池存放庫緩存(存儲共享SQL和PL/SQL區)和數據字典緩存(Oracle數據庫對象信息)以及會話期間信息(對於MTS)。由於這些信息是應用程序需要經常訪問的,因此這些信息需要保持高的命中率。可以通過以下語句來確認共享池數據的命中率:
◆庫緩存:
- select gethitratio from v$librarycache 應大於90%
- select sum(reloads)/sum(pins) from v$librarycache 應小於1%
◆數據字典緩存:
- select sum(getmisses)/sum(gets) from v$rowcache 應小於15%
由於程序設計人員的水平參差不齊,可能存在大的匿名塊,這會導致SQL不能重用,因此需要找出大的匿名塊以轉換為存儲過程達到重用:
- select * from v$sqlarea where command_type=47 and length(sql_text)>500
而對於一些應用系統非常頻繁使用的SQL對象如存儲過程、函數、包等,可以通過釘在內存中的方式來防止由於共享池太小被移出:
- exec dbms_shared_pool.keep
◆數據塊緩沖區(Db block buffer):
數據塊緩沖區存放用戶所經常訪問的數據文件的數據塊內容以及用戶修改的數據內容。數據庫把數據文件裡的內容讀到內存中,下次需要時直接從內存中讀取,從而減少了磁盤的I/O和響應時間。當然,一般只在比較小的數據表(如常用代碼表)才緩存到內存中。
由於數據快緩沖區中不可能存放所有的數據,因此可使用LRU算法來確定移出哪些數據塊,但又盡量保證有較高的數據命中率。
查看數據塊命中率的SQL語句為:
- select 1-(phy.value/(cur.value+con.value))
from v$sysstat cur,v$sysstat con,v$sysstat phy- where cur.name='db block gets' and con.name='consistent gets'
- and phy.name='physical gets'
如果這個命中率小於0.85,就要考慮為數據塊緩沖區分配更多的內存了。
◆重做日志緩沖區(Log buffer):
重做日志緩沖區存放從用戶內存區復制來的每個DML或DDL語句的重做條目。如果這個緩沖區分配太小會導致沒有足夠的空間來放重做條目而等待。
2.I/O和資源競爭
由於有眾多的進程要寫數據文件,因此需要通過I/O調整來解決I/O瓶頸問題。如果在設計階段有效地考慮了表空間的合理分配,就能有效地在一定程度上減少I/O競爭。在數據庫運行時,由於數據的動態增長,原來分配給表或索引的空間已經用完,Oracle會自動分配空間給這些Oracle數據庫對象。而這個動態分配會對系統性能有所影響,所以要求:
避免動態空間管理
表空間的本地化管理,以減少與數據字典表空間的磁盤競爭。
在系統設計和試運行階段數據量相對較小,效率低下的SQL可能並不會影響系統響應時間,但當系統數據量增長到一定程度時,需要在系統運行時監控並找出是哪些SQL不能有效使用索引或缺少索引,並進行相應調整:建立索引;修改SQL寫法。
另外,在Oracle中,需要采用一些機制來保證Oracle數據庫對象在使用期間的穩定性和數據的一致性,如使用鎖存器(latch)、鎖(lock)等。因此爭用和這些機制相關的資源會影響數據庫的性能。為了減少這種資源競爭,可以通過調整數據庫的相關初始化參數(如db_block_lru_latches、 dml_locks)來減少資源的爭用,優化數據庫性能。