<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      Oracle數據庫優化性能技術

      [摘要]摘要: Oracle數據庫是當前應用最廣泛的大型數據庫之一,而其性優化直接關系到系統的運行效率。本文以數據庫性能優化的基本原則為出發點,闡述了在數據庫設計階段如何避免競爭和如何優化數據訪問,在數據庫...
        摘要: Oracle數據庫是當前應用最廣泛的大型數據庫之一,而其性優化直接關系到系統的運行效率。本文以數據庫性能優化的基本原則為出發點,闡述了在數據庫設計階段如何避免競爭和如何優化數據訪問,在數據庫運行階段如何從操作系統和數據庫實例級別上調整內存和I/O來達到數據庫性能優化的各種技術。

        關鍵詞:Oracle數據庫;性能優化;內存;I/O

        1. 引言

        隨著網絡應用和電子商務的不斷發展,各個站點的訪問量越來越大,數據庫規模也隨之不斷的擴大,數據庫系統的性能問題就越來越突出,因此,如何對數據庫進行調優至關重要:如何使用有限的計算機系統資源為更多的用戶服務?如何保證用戶的響應速度和服務質量?這些問題都屬于服務器性能優化的范疇。

        作為全球第一大數據庫廠商,Oracle數據庫在國內外獲得了諸多成功應用,據統計,全球93%的上市.COM公司、65家"財富全球100強"企業不約而同地采用Oracle數據庫來開展電子商務。我國很多企業、政府單位及電子商務網站也采用了Oracle作為數據庫服務器。Oracle數據庫服務器是高度可優化的軟件產品,經常性的調整可以優化應用系統的性能,防止出現系統瓶頸。

        數據庫性能優化的基本原則就是:通過盡可能少的磁盤訪問獲得所需要的數據。要評價數據庫的性能,需要在數據庫調節前后比較其評價指標:響應時間和吞吐量之間的權衡、數據庫的可用性、數據庫的命中率以及內存的使用效率,以此來衡量調節措施的效果和指導調整的方向。

        對Oracle數據庫進行性能調整時,應當按照一定的順序進行,因為系統在前面步驟中進行的調整可以避免后面的一些不必要調整或者代價很大的調整。一般來說可以從兩個階段入手:

        1、設計階段:對其邏輯結構和物理結構進行優化設計,使之在滿足需求條件的情況下,系統性能達到最佳,系統開銷達到最;

        2、數據庫運行階段:采取操作系統級、數據庫級的一些優化措施來使系統性能最佳;

        2. 在系統設計開發階段調整數據庫

        為了充分利用Oracle數據庫的功能特性,在設計信息系統時,數據庫設計人員需要根據業務情況(如訪問量或客戶端數量)和現有資源狀況(如數據庫服務器的配置)考慮系統結構和數據庫的邏輯結構的設計:

        2.1調整應用程序結構設計。

        即應用程序采用的是傳統的C/S兩層體系結構,還是B/W/D三層體系結構。不同的應用程序體系結構要求的數據庫資源是不同的。

        2.2恰當使用分區、索引及存檔功能。

        如果某種業務的數據量增長非?欤梢钥紤]存放該業務的數據庫表是否使用Oracle數據庫的分區功能;對于經常訪問的數據庫表是否需要建立索引;對于經常訪問但是當業務流程完成后不再變動的數據可采用放入歷史檔案的方法來實現應用系統中訪問盡可能少的數據量。

        2.3恰當編寫訪問數據的SQL語句。

        良好的SQL語句可以被數據庫重復使用而減少分析時間;恰當的使用索引可使訪問的數據塊大大減少從而減少響應時間。應用程序的執行最終將歸結為數據庫中的SQL語句執行,因此SQL語句的執行效率決定了Oracle數據庫的性能。Oracle公司推薦使用Oracle語句優化器(Oracle Optimizer)和行鎖管理器(row-level manager)來調整優化SQL語句。

        2.4調整硬盤I/O

        這一步是在信息系統開發之前完成的。數據庫管理員可以將組成同一個表空間的數據文件放在不同的硬盤上,做到硬盤之間I/O負載均衡。在磁盤比較富裕的情況下還應該遵循以下原則:

         將表和索引分開;

         創造用戶表空間,與系統表空間(system)分開磁盤;

         創建表和索引時指定不同的表空間;

         創建回滾段專用的表空間,防止空間競爭影響事務的完成;

         創建臨時表空間用于排序操作,盡可能的防止數據庫碎片存在于多個表空間中。

        2.5確定數據塊大小和存儲參數。

        由于數據庫的塊大小在數據庫創建以后就不能在修改(除非重建數據庫),因此為了減少數據鏈接和行遷移,又提高磁盤空間的利用率,在設計數據庫時要確定合適的數據塊大小和存儲參數。通常我們是根據樣例數據確定數據塊大小,而根據業務現狀和未來發展趨勢確定存儲參數。
        3. 在數據庫運行階段調整數據庫

        數據庫運行階段調整數據庫包括兩個方面:操作系統級的調整;數據庫級的調整。

        3.1 操作系統級的調整

        實施操作系統級調整的主要目的是減少內存交換,減少分頁,使SGA(System Globle Area)可留駐內存。

        3.1.1減少內存交換

        內存交換(swapping)可能會造成很大的內存開銷,應將它最小化。運行在Solaris Unix操作系統上的Oracle數據庫,可利用vmstat或sar命令來檢查交換,查看到系統級內存和硬盤I/O的使用情況,調整unix數據緩沖池的大小、每個進程所能使用的內存大小等參數。


         vmstat命令

        它報告Solaris上的進程、虛擬內存、磁盤、分頁和CPU的活動情況。下面命令將顯示系統每5秒鐘做的事情的概要:
      % vmstat 5

         sar命令

        用于監控交換、分頁、磁盤和CPU活動。下面命令用于每10秒顯示10次分頁活動的概要:
      % sar -p 10 10

        若系統內存交換較多,且需要節省內存,可采用以下措施:

        1) 避免運行不必要的系統daemon進程或應用程序進程;

        2) 在不明顯影響數據塊命中率的前提下減少數據庫緩沖區的數量,以釋放一些內存;

        3) 減少UNIX文件緩沖區的數量(特別是在使用裸設備時)。

        3.1.2控制分頁

        少量的內存分頁不會太顯著地影響系統的性能,因為應用程序不必全部放在內存中。但是分頁過多將會造成系統性能下降。為了檢測過多的分頁,可在快速響應或空閑期間運行測量,并與響應遲緩時的測量進行比較?赏ㄟ^以下辦法來解決:

         使用vmstat或sar -p監控分頁;

          安裝更多的內存;

          將一些工作移到另一系統中;

          配置系統核心使用更少的內存;

          保持SGA在單個共享內存段中。

        3.1.3使SGA(System Globle Area)留駐內存

        SGA是對數據庫數據進行快速訪問的一個系統全局區,若SGA本身需要頻繁地進行釋放、分配,則不可能達到快速訪問數據的目的,因此,要求SGA駐留內存。這時,我們可以重新配置UNIX核心,調整一些操作系統參數以達到增加共享內存的目的。

        3.2 數據庫級的調整

        每一個Oracle實例都是由一組Oracle后臺進程和SGA的一個內存區組成的。這組后臺進程會自動的讀寫數據庫的數據文件,因此,數據庫性能可以被這些因素所影響:SGA各部分的分配是否合理,使用效率是否正常;I/O和鎖競爭是否較多。

        3.2.1 SGA的分配及使用效率

        分配給每個實例的內存,即SGA的使用效率如何,會大大影響數據庫系統的性能。SGA由下列部分組成:共享池、數據塊緩沖區、重做日志緩沖區、大池組成。

        l 共享池(Shared pool)

        共享池存放庫緩存(存儲共享SQL和PL/SQL區)和數據字典緩存(數據庫對象信息)以及會話期間信息(對于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語句的重做條目。如果這個緩沖區分配太小會導致沒有足夠的空間來放重做條目而等待。

        3.2.2 I/O和資源競爭

        由于有眾多的進程要寫數據文件,因此需要通過I/O調整來解決I/O瓶頸問題。如果在設計階段有效地考慮了表空間的合理 關鍵詞標簽:技術,優化,性能,數據庫


      學習教程快速掌握從入門到精通的SQL知識。




      日韩精品一区二区三区高清