<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    ??? 數據庫結構(五).內存結構
    ?
    ?
    ??? Oracle 的內存可以分為:系統全局區(SGA)、程序全局區(PGA)、用戶全局區(UGA),其主要用來儲存:
    ??? 1 、程序代碼
    ??? 2 、活動和非活動的session信息
    ??? 3 、程序執行過程中的信息(例如Cursor)
    ??? 4 、與 Oracle 進程共享和通信的信息(例如鎖)
    ??? 5 、被緩存到內存的信息
    ?
    ?
    一、系統全局區(SGA)
    ?
    ??? SGA 是一組為系統分配的共享內存結構,可以包含多個數據庫實例的數據或控制信息。當實例啟動時, SGA 即被自動分配,實例關閉時被自動回收。
    ??? SGA 按其作用的不同,可以分為:數據緩沖區、日志緩沖區、共享池、大池、 Java 池、流池等。
    ?
    ??? 查看 SGA 的大小可以使用 :
    ?
    ??? SQL> select * from v$sga;
    ??? NAME????????????????????? VALUE
    ??? -------------------- ----------
    ??? Fixed Size?????????????? 453492
    ??? Variable Size???????? 109051904
    ??? Database Buffers?????? 25165824
    ??? Redo Buffers???????????? 667648
    ?
    1、數據緩沖區(Database Buffer Cache)
    ?
    ??? 用戶第一次執行查詢或修改數據操作時,服務器進程將數據從數據文件中讀取出來,并裝入到數據緩沖區中,這樣操作即在內存中完成,用戶下一次訪問相同數據時, Oracle 可以直接將數據緩沖區中的數據返回給用戶,大大提高相應速度。
    ?
    ??? 數據緩沖區由許多相同大小的緩存塊組成,其大小與數據塊相同,從其是否被利用角度可分為三類:
    ??? (1) 臟緩存塊:保存了已經被修改過的數據,這些數據需等待 DBWR 要重新被寫入數據文件中;
    ??? (2) 空閑緩存塊:不包含任何數據,等待被寫入;
    ??? (3) 命中緩存塊:用戶正在訪問的緩存塊,這些緩存塊將被保留在數據緩沖區中。
    ?
    ??? Oracle 通過最近最少使用列表(LRU)寫入列表(DIRTY)來管理數據緩沖區中的緩存塊。
    ??? (1) LRU :包含所有三類緩存塊,使用 LRU 算法將緩沖區中最近一段時間內訪問次數最少的緩存塊移除緩沖區。
    ??? (2) DIRTY :包含了已經被修改并需要寫入數據文件的緩存塊
    ?
    ??? 數據緩沖區的工作機制:
    ??? (1) 用戶提交訪問申請, Oracle 在數據緩沖區中查找,若該數據塊位于數據緩沖區中,則直接返回給用戶,稱之為 “ 緩存命中 ”
    ??? (2) 若數據緩沖區中查找不到所需數據塊,則先從數據文件提取到緩存中,再從緩存讀取并返回給用戶,稱之為 “ 緩存失敗 ”
    ??? (3) 當 “ 緩存失敗 ” 時,先找到空閑緩存塊,若沒有空閑塊,則將 LRU 列表中的臟緩存塊移入 DIRTY 列表
    ??? (4) 當 DIRTY 列表到達一定長度時,由 DBWR 將臟數據塊的數據寫入到磁盤文件,重新刷新數據緩沖區
    ?
    ??? 8i以前的版本,數據緩存的大小由DB_BLOCK_BUFFER(數據緩存區緩存塊數量)和DB_BLOCK_SIZE(數據塊大小)兩者的乘積決定,而在9i以后,直接使用DB_CACHE_SIZE指定
    ?
    2、日志緩沖區(Redo Log Buffer)
    ?
    ??? 日志緩沖區用于存儲數據庫的修改信息。當日志緩沖區的日志信息達到一定數量時,由 LGWR 進程將日志寫入到日志文件組。
    ??? 日志緩沖區是一個直接從頂端向底端寫入數據的循環緩沖區,當寫到最底端時,再返回到緩沖區的起始點循環寫入。
    ??? 日志緩沖區大小由 LOG_BUFFER 參數指定,并可以在運行的過程中中進行動態修改。日志緩沖區對數據庫性能的影響較小,當然設置較大的日志緩沖區可以減少日志文件的 I/O 次數,提高數據庫性能。
    ?
    3、共享池(Shared Pool)
    ?
    ??? 共享池分為:庫緩沖區、數據字典緩沖區、用戶全局區 三部分。共享池大小由 SHARED_POOL_SIZE 參數設定。
    ??? (1) 庫緩沖區:緩存 SQL 語句的分析碼、執行計劃
    ??? (2) 數據字典緩沖區:包含從數據字典中得到的表、列定義和權限
    ??? (3) 用戶全局區:包含了用戶的session信息
    ?
    ??? 當一條SQL語句提交時,Oracle首先從共享池的緩沖區內搜索,查看是否有相同SQL被解析并執行,若存在則不必再次解析。
    ?
    4、大池(Large Pool)
    ?
    ??? 大池是數據庫管理員能夠配置的可選內存空間,可用于不同類型的內存存儲。
    ?
    ??? Oracle 的某些操作可能需要內存中使用大量的緩存,例如:
    ??? 1、數據庫的備份或恢復操作
    ??? 2、執行具有大量排序操作的 SQL 語句
    ??? 3、執行并行化的數據庫操作
    ??? 若沒有創建大池,這些操作需要的緩存空間都將在共享池或PGA中分配,大量的占用會影響到共享池和PGA的使用效率。大池的大小通過 LARGE_POOL_SIZE 設定。
    ??? 注:在共享服務器操作模式下,服務器進程會將session信息存儲在大池中,而非共享池。session結束后大池即釋放內存。
    ?
    5、Java池(Java Pool)
    ?
    ??? Oracle提供了對Java語言的支持,所以提供Java池。 Java池主要用于對Java語言提供語法分析區。
    ??? Java 池的大小由參數 JAVA_POOL_SIZE 設定。
    ?
    6、流池(Stream Pool)
    ?
    ??? 這是Oracle Stream專用的內存池,Oracle Stream是數據庫中的一個數據共享工具。
    ??? 該值由STREAMS_POOL_SIZE指定大小。若未配置該內存區,則當使用到 Stream功能時 ,Oracle會分配共享池中至多10%的空間作為Stream內存。
    ?
    ?
    二、程序全局區(PGA)
    ?
    ??? PGA是包含單獨用戶或服務器數據和控制文件的內存區域。PGA由用戶連接到數據庫時創建,進行自動分配,且是非共享的,只有服務進程本身才能訪問它自己的PGA區。
    ??? 每一個服務進程都有自己的PGA區,PGA的內容與結構和數據庫的操作模式(專用/共享服務器)有關。
    ?
    ??? PGA 按照oracle官方文檔解釋,叫做程序全局區(Program Global Area),但也有些資料上說還可以理解為進程全局區(Process Global Area)。這兩者沒有本質的區別,它首先是一個內存區域,其次,該區域中包含了與某個特定服務器進程相關的數據和控制信息。每個進程都具有自己私有的PGA區,這也就意味著,這塊區域只能被其所屬的進程進入,而不能被其他進程訪問,所以在PGA中不需要latch這樣的內存結構來保護其中的信息。籠統的來說,PGA里包含了當前進程所使用的有關操作系統資源的信息(比如打開的文件句柄等)以及一些與當前進程相關的一些私有的狀態信息。
    ?
    ??? 每個PGA區都包含兩部分:
    ??? (1) 固定PGA部分(Fixed PGA):這部分包含一些小的固定尺寸的變量,以及指向變化PGA部分的指針。
    ??? (2) 變化PGA部分(Variable PGA):這部分是按照堆(Heap)來進行組織的,所以這部分也叫做PGA堆。可以從X$KSMPP視圖中看到有關PGA堆的分布信息。PGA堆中所包含的內存結構包括:
    ?
    ??? 有關一些固定表的永久性內存。
    ??? 如果session使用的是專用連接方式(dedicated server),則還含有用戶全局區(UGA-User Global Area)子堆。如果session使用的是共享連接方式(shared server),則UGA位于SGA中。
    ??? 調用全局區(CGA-Call Global Area)子堆。
    ?
    ?
    三、用戶全局區(Sort Area)
    ?
    ??? UGA是包含與某個特定session相關信息的內存區域,比如session的登錄信息以及session私有的SQL區域等。
    ?
    ??? 每個UGA也包含兩個部分:
    ??? (1) 固定UGA部分(Fixed UGA):這部分包含一些小的固定尺寸的變量,以及指向變化UGA部分的指針。
    ??? (2) 變化UGA部分(Variable UGA):這部分也是按照堆來進行組織的,可以從X$KSMUP視圖中看到有關UGA堆的分布情況。
    ?
    ??? UGA堆的分布與OPEN_CURSORS、OPEN_LINKS等參數有關系。所謂的游標(cursor)就是放在這里的。
    ??? UGA堆中所包含的內存結構包括:
    ??? (1) 私有SQL區域(Private SQL Area):這部分區域包含綁定變量信息以及運行時的內存結構等數據。每一個發出SQL語句的session都有自己的私有SQL區域。
    ??????? 這部分區域又可分成兩部分:
    ??????? (i) 永久內存區域:這里存放了相同SQL語句多次執行時都需要的一些游標信息,比如綁定變量信息、數據類型轉換信息等。這部分內存只有在游標被關閉時才會被釋放。
    ??????? (ii)運行時區域:這里存放了當SQL語句運行時所使用的一些信息。這部分區域的大小尺寸依賴于所要執行的SQL語句的類型(sort或hash-join等)和復雜度以及所要處理的數據行的行數以及行的大小。在處理SQL語句時的第一步就是要創建運行時區域,對于DML(INSERT、UPDATE、DELETE)語句來說,SQL語句執行完畢就釋放該區域;而對于查詢語句(SELECT)來說,則是在所有數據行都被獲取并傳遞給用戶以后被釋放,或者該查詢被取消以后也會被釋放。
    ??? (2) Session相關的信息。這部分信息包括:
    ??????? 1.正在使用的包(package)的狀態信息。
    ??????? 2.使用alter session這樣的命令所啟用的跟蹤信息、或者所修改的session級別的優化器參數(optimizer_mode)、排序參(sort_area_size等)、修改的NLS參數等。
    ??????? 3.所打開的dblinks。
    ??????? 4.可使用的角色(roles)等。
    ?
    ??? 從上面可以很明顯的看出,我們最需要關注的就是私有SQL區域中的運行時區域了。實際上,從9i以后,對這部分區域有了一個新的名稱:SQL工作區域(SQL Work Area)。SQL工作區域的大小依賴于所要處理的SQL語句的復雜程度而定。如果SQL語句包含諸如group by、Hash-join等這樣的操作,則會需要很大的SQL工作區域。實際上,我們調整PGA也就是調整這塊區域。后面還會說到這部分內容。
    ?
    ??? 而UGA所處的位置完全由session連接的方式決定:
    ??? 如果session是通過共享服務器(shared server)方式連到數據庫的,則毫無疑問,UGA必須能夠被所有進程訪問,所以這個時候UGA是從SGA中進行分配的。進一步說,如果SGA中設置了large pool,則UGA從large pool里進行分配;否則,如果沒有設置large pool,則UGA只能從shared pool里進行分配了。
    ??? 如果session是通過專用服務器(dedicated server)方式連到數據庫的,則UGA是從進程的PGA中進行分配的。
    ?
    ?
    ?
    附一: SGA 各部分大小解析 (轉載)
    *********************************************************************************
    ?
    SGA中的The fixed area包含了數千個原子變量,以及如latches和指向SGA中其它區域的pointers(指針)等小的數據結構.通過對fixed table內表X$KSMFSV查詢(如下)可以獲得這些變量的名字,變量類型,大小和在內存中的地址.
    SQL> select ksmfsnam, ksmfstyp, ksmfssiz, ksmfsadr from x$ksmfsv;
    ?
    這些SGA變量的名字是隱藏的而且幾乎完全不需要去知道.但是我們可以通過結合fixed table內表X$KSMMEM獲得這些變量的值或者檢查它們所指向的數據結構.
    SQL>select a.ksmmmval from x$ksmmem a where addr=(select addr from x$ksmfsv where ksmfsnam= ’ kcrfal_ ’ );
    ?
    SGA中的fixed area的每個組成部分的大小是固定的.也就是說它們是不依靠于其它的初始化參數的設置來進行調整的.fixed area中的所以組成部分的大小相加就是fixed area的大小.
    ?
    The variable area:
    ?
    SGA 中的the variable area是由large pool和shared pool組成的.large pool的內存大小是動態分配的,而shared pool的內存大小即包含了動態管理的內存又包含了永久性的(已經分配的)內存.實際上,初始化參數shared_pool_size的大小設置是指定shared pool中動態分配的那部分內存的一個大概的SIZES而不是整個shared pool的SIZES
    ?
    Shared pool 中永久性的內存包含各種數據結構如 :the buffer headers, processes, sessions, transaction arrays, the enqueue resources , locks, the online rollback segment arrays, various arrays for recording statistics. 其中大部分的SIZE是依靠初始參數的設置來確定的. 這些初始參數只能在實例被關閉的狀態下才能夠進行修改 . 所以這里說的永久性是針對實例打開狀態下的生存期而言. 簡單的一個例子PROCESSES參數. 在這個 process arrays 中的 slots 用完之后 , 如果有其它的 process 想再申請一個 process 則會失敗 , 因為它們在內存中的大小是在實例啟動時預分配的. 不能動態修改之 .
    ?
    針對很多永久性的 arrays, 有很多的 X$ 表都把這些元素做一個記錄而成員結構則作為字段 .V$ 視圖的數據就是從這些 X$ 表獲得 . 如 V$PROCESS 是基于 X$KSUPR 內表的 .V$PROCESS 視圖不包含 X$KSUPR 的全部字段 . X$KSUPR也沒有覆蓋SGA進程結構的所有成員.
    ?
    The variable area的在SGA中的SIZES就等于LARGE_POOL_SIZE,SHARED_POOL_SIZE和永久性的內存arrays的SIZE三者相加. 永久性的內存arrays的總的SIZE可以通過初始參數的設置來計算得到.然而,你需要知道從參數獲得這些array sizes的方程式,每個array元素大小的字節數,還有array頭信息的sizes.這些跟Oracle的版本號和OS有關.實際使用中,我們是不必要計算這個永久性的內存arrays的SIZE的.如果想知道,一個方法就是在STARTUP NOMOUNT數據庫時記下the variable area.然后減去參數中LARGE_POOL_SIZE和SHARED_POOL_SIZE的大小就可以.
    ?
    The database block area:
    ?
    這個區域是數據庫塊的拷貝.在Oracle 8i中,buffer數由DB_BLOCK_BUFFERS指定.每個buffer的大小由DB_BLOCK_SIZE指定.所以這個區域的大小是兩者相乘.在Oracle 9i中,這個區域的大小是DB_CACHE_SIZE指定.這個區不包含它們自己的控制結構,只包含database block copies data.每個buffer的header信息存在于SGA的the variable area中.還有latches信息也放在SGA的the variable area中.在設置DB_BLOCK_BUFFERS時每4個BUFFERS會影響the variable area的1K的SIZE.關于這一點.可以通過測試(針對8i而言).
    ?
    The log buffer:
    ?
    這個區域的SIZE是由參數LOG_BUFFER指定的.如果OS支持內存保護,log buffer將會被兩個保護頁面包圍起來以免被一些ORACLE的錯誤進程損壞log buffer.在SGA中,跟其它的如variable area和database block area相比,log buffer是非常小的.log buffer分成內部的buffer blocks,而這些block各有8個字節的頭部信息存在于variable area中.
    ?
    The instance lock database:
    ?
    在OPS/RAC配置中,instance locks用來控制由所有instances共享的資源以串行的方式被進入并使用.SGA中的這個區域所維護的是本地實例所要使用的數據庫資源,所有實例和進程都會用到的數據庫資源,還有所有實例和進程當前需要的或者已經擁有的鎖(LOCKS).這三個arrays的SIZE分別由參數LM_RESS,LM_PROCS,LM_LOCKS參數指定.(這三個參數是RAC的參數,在單實例中用SHOW PARAMETER是查看不到的). The instance lock database還包含了message buffers和其它的structure.但是其SIZE是非常小的.
    ?
    這個區域的SIZE是沒辦法在實例啟動的時候看到的.這是Oracle Internals.可以用ORADEBUG工具查看.SQL>ORADEBUG IPC.至于ORADEBUG工具就不做介紹.用這個工具做操作時需要經過Oracle Support同意.
    ?
    可以用以下的兩種方式DUMP SGA:
    ?
    SQL>ALTER SESSION SET EVENTS 'immediate trace name global_area level 2';
    或者
    SQL>ORADEBUG DUMP GLOBAL_AREA 2;
    *********************************************************************************
    ?
    ?
    ?
    ?
    附二、PGA 管理(轉載)
    *********************************************************************************
    ?
    http://blog.oracle.com.cn/index.php/2446/viewspace-2843.html
    ?
    上文是一篇對于PGA的詳細介紹,如需仔細了解該部分內容,則可查閱
    ?
    ?
    ?
    ?
    posted on 2008-08-22 22:13 decode360 閱讀(328) 評論(0)  編輯  收藏 所屬分類: 08.DBA
    主站蜘蛛池模板: 亚洲AV永久无码精品一区二区国产| 亚洲日产乱码一二三区别| 欧洲美熟女乱又伦免费视频| 免费成人高清在线视频| 在线观看国产一区亚洲bd| 亚洲一线产区二线产区精华| 国产V亚洲V天堂无码| 亚洲精品成人区在线观看| 免费观看的av毛片的网站| 一色屋成人免费精品网站| 黄色片免费在线观看| j8又粗又长又硬又爽免费视频| 亚洲七久久之综合七久久| 亚洲一区电影在线观看| 亚洲资源在线观看| 精品亚洲综合在线第一区 | 2020天堂在线亚洲精品专区| 久久亚洲精品成人| 亚洲日韩乱码中文无码蜜桃臀网站| 免费国产在线观看不卡| 在线视频免费观看www动漫| 中文字幕人成无码免费视频| 免费观看美女用震蛋喷水的视频| 无码一区二区三区免费| 午夜视频免费在线观看| 两个人看的www高清免费观看| a级毛片免费观看网站| 国产高清视频免费在线观看| 一级做a免费视频观看网站| 一个人看的免费高清视频日本| 免费人成大片在线观看播放| 日日摸夜夜添夜夜免费视频| 日本黄页网址在线看免费不卡| 黄色三级三级免费看| 一级一看免费完整版毛片| 成人免费ā片在线观看| 大地影院MV在线观看视频免费| 免费a级毛片无码a∨免费软件| 国产真人无码作爱视频免费| 亚欧免费一级毛片| 18禁网站免费无遮挡无码中文 |