oracle性能Statspack使用之命中率調整 軟件測試
影響Oracle的性能的因素有很多,例如oracle自身的sga設置,磁盤I/O設置等。但需要強調的一點就是oracle調整的原始動機都是減少磁盤I/O。下面舉一個數據來說明磁盤I/O的影響之大,ram中獲取數據塊和磁盤上獲取數據塊的時間差異相差兩個數量級,可以認為ram比磁盤塊14000倍,在磁盤上的訪問時間是毫秒級(一秒的千分之一),在ram的速度是納秒級的(一秒的10億分之一)。從上面可以看出,如果在理論上將oracle的數據全部緩存在內存中,那訪問速度是極快的。
鑒于當前學習oracle還不深,本文檔的目的是如何通過statspack來分析數據庫的命中率和調整oracle的SGA。從oracle自身來說,性能最大的兩個瓶頸就是命中率和等待事件。等待事件作為接下來第二個學習點,本文檔當作命中率和oracle內存機制熟悉的一次總結。
本次總結分為以下幾點:
1、oracle的SGA介紹;
2、SGA各部分命中率介紹;
3、命中率相關的Statspack數據表作用介紹;
4、如何使用statspack獲得和分析命中率。
一、 oracle的SGA
通常oracle實例包括了兩個組件:系統全局區域SGA和oracle后臺進程。當啟動oracle的時候,oracle就會用malloc()命令去建立一個內存區域作為SGA。
SGA總容量=共享池(shared pool)+緩存區高速緩存(data buffer cache)《db_keep_cache_size,db_recycle_cache_size,db_nk_cache_size》+日志緩沖區(redo log buffer)《11Kredo log buffer的保護頁》+大型池(large pool)+java存儲區(java pool)+《streams_pool_size(10g中的新內存池)+16M(sga內部內存消耗,適合于9I及之前版本)》
1、共享池由庫緩存(library cache)與字典緩存(dictionary cache)兩部分,庫緩存包括共享sql區(shared sql areas)、pl/sql存儲過程和包以及控制結構(如鎖、庫緩存句柄)。
2、大型池屬于可變區,用于共享服務(shared server mts方式)的會話內存和oracle分布式事務處理的oracle接口,oracle備份和恢復操作(啟用了rman)。
3、Java池的內存用于存儲所有會話中特定java代碼和jvm中的數據。屬于可變區。
參數介紹:
1、Sga_max_size ,SGA可用最大物理內存是由該參數決定的?捎胹how parameter sga查詢。平常查看任務管理器,你會發現oracle進程顯示的內存使用數量小于sga最大的內存數量,是因為oracle實例開啟時,只載入內存區最小的大小,其他sga內存只作為虛擬內存分配,這樣就會有一個風險,產生過多的page in/out操作,這種磁盤交換是很耗時間的。因而可以用pre_page_sga設置為true ,lock_sga(危險,導致數據無法開啟,原因未研究,官方說法是跟PC機有關)設置為true解決。
2、db_block_size,執行許多全表收索的oracle數據倉庫和系統將會從16K大小塊中受益。另外db_file_multiblock_read_count與db_block_size之前有非常重要的關系,在unlx物理層上,oracle總是以最小64K的數據塊讀入。
3、db_cache_size指定data buffer cache的大小。在oltp系統中,推薦設置為sga_max_siz/2-sga_max_size*2/3.
非標準塊尺寸的塊大小可以在創建表空間(create tablespace)通過blocksize參數指定,而不同塊尺寸的buffer cache的大小就由相應參數db_nk_cache_size來指定,其中n可以是2,4,8,16或者32。另外注意一點,db_nk_cache_size參數不能設定標準塊尺寸的緩沖區大小,舉例來說,如果db_block_size設定為4k,就不能再設定db_4k_cache_size參數了。
4、shared_pool_size決定共享區的大小
5、large_pool_size確定大型池的大小
6、java_pool_size確定java池的大小
文章來源于領測軟件測試網 http://www.kjueaiud.com/