国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

PL/SQL學習之oracle排序系列二(上)

2024-08-29 13:37:44
字體:
來源:轉載
供稿:網友

  上一期講了Oracle在什么情況下需要排序,這次我們把注重力集中到與排序相關的幾個內存組件
  
  PGA:
  
  The PRocess Global Area,它是屬于私有內存段,段內的內容只對本進程可見,這不同于sga的共享內存段。
  
  pga的內存結構不需要latch來保護,因為不會有其他進程同時訪問。PGA包括兩個部分,fixed pga,variable pga。
  
  fixed pga保存一些數據結構和指向variable pga的指針。PGA也是通過freelist和bUCket來分配和治理。
  
  UGA:
  
  User Global Area,它包含以下一些信息
  
  The persistent and runtime areas for open cursors
  State information for packages, in particular package variables
  java session state
  The roles that are enabled
  Any trace events that are enabled
  The NLS parameters that are in effect
  Any database links that are open
  The session's mandatory access control (MAC) label for Trusted Oracle
  
  和PGA一樣,它也分為fixed,variable兩個部分,同樣通過freelist和bucket分配和治理內存。
  
  CGA:
  
  Call Global Area,跟PGA不一樣,CGA只是短暫存在的,它只存在于每一次調用周期,當
  
  Parse an SQL statement
  Execute an SQL statement
  Fetch the outputs of a SELECT statement
  
  的時候它會被使用到
  
  在分析語句的時候產生的遞規調用將會使用到CGA,包括用于檢查語義,生成執行計劃,PL/SQL中的遞規調用也會用到它,DML的觸發器遞規
  
  調用同樣會需要它。Java Call Memory也是在CGA中,這也是ORACLE內存治理中唯一一個用到垃圾收集(garbage collection)的內存區域。
  
  關于PGA,UGA,CGA的具體解釋請參考Steve Adamas的<<oracle8i internal services for waits, latches, locks>>
  
  sort_area_size:
  
  排序空間的最大限制,在完成排序階段后,oracle將釋放內存并保留sort_area_retained_size用于fetch階段,當最后一條記錄被fetch回客戶端后,oracle將會釋放sort_area_retained_size。
  
  sort_area_retained_size:
  
  在UGA中分配的排序空間,當oracle發生排序時,先會從UGA中分配內存直到達到sort_area_retained_size的限制,然后會繼續在PGA中分配內存一直到sort_area_size限制,如上面所說的,sort_area_retained_size將會在fetch階段被保留,在fetch完成后釋放給OS或PGA(區別在于是否UGA是PGA的subheap)
  
  在9iR2版本以前,UGA,CGA一直是PGA的subheap,當它們被釋放后將會釋放給PGA而不是釋放給OS,這是由于PGA的內存分配是通過malloc,brk來實現的,但是從9iR2版本開始,我們有了選擇,_use_realfree_heap參數給我們機會去改變PGA內存的分配方式,當_use_realfree_heap為true時,PGA的內存分配將會通過mmap來實現,這樣當調用munmap的時候將不必將內存返回給進程而直接返回給OS.下面我們來驗證一下
  
  alter system set "_use_realfree_heap"=true;
  ALTER SESSION SET EVENTS
  'immediate trace name heapdump level 1';
  
  HEAP DUMP heap name="pga heap" desc=0xc6a6400
  extent sz=0x206c alt=92 het=32767 rec=0 flg=2 opc=2
  parent=(nil) owner=(nil) nex=(nil) xsz=0xfff8
  EXTENT 0 addr=0xb72c0008
  ******************************************************
  ******************************************************
  HEAP DUMP heap name="top call heap" desc=0xc6a8c00
  extent sz=0x206c alt=100 het=32767 rec=0 flg=2 opc=2
  parent=(nil) owner=(nil) nex=(nil) xsz=0xfffc
  EXTENT 0 addr=0xb72b0004
  Chunk b72b000c sz=  32780  perm   "perm      " alo=40
  Chunk b72b8018 sz=  31672  free   "        "
  Chunk b72bfbd0 sz=   1072  recreate "callheap    " latch=(nil)
  ds c6a8300 sz=   1072 ct=    1
  Total heap size  =  65524
  ******************************************************
  ******************************************************
  HEAP DUMP heap name="top uga heap" desc=0xc6a8d20
  extent sz=0xffdc alt=100 het=32767 rec=0 flg=3 opc=3
  parent=(nil) owner=(nil) nex=(nil) xsz=0xfffc
  EXTENT 0 addr=0xb72e0004
  Chunk b72e000c sz=  65524  free   "        "
  EXTENT 1 addr=0xb72d0004
  Chunk b72d000c sz=    48  free   "        "
  Chunk b72d003c sz=  65476  recreate "session heap  " latch=(nil)
  ds b72c7628 sz=  65476 ct=    1
  Total heap size  =  131048
  
  當_use_realfree_heap為true時,pga,uga,cga為獨立的heap
  
  strace -p xxxx -o 1.txt
  
  mmap2(0xb7271000, 65536, PROT_READPROT_WRITE, MAP_PRIVATEMAP_FIXED, 7, 0) = 0xb7271000
  mmap2(0xb7281000, 65536, PROT_READPROT_WRITE, MAP_PRIVATEMAP_FIXED, 7, 0) = 0xb7281000
  mmap2(0xb7291000, 65536, PROT_READPROT_WRITE, MAP_PRIVATEMAP_FIXED, 7, 0) = 0xb7291000
  mmap2(NULL, 1048576, PROT_NONE, MAP_PRIVATEMAP_NORESERVE, 7, 0xf1) = 0xb7121000
  mmap2(0xb7121000, 65536, PROT_READPROT_WRITE, MAP_PRIVATEMAP_FIXED, 7, 0) = 0xb7121000
  mmap2(0xb7131000, 65536, PROT_READPROT_WRITE, MAP_PRIVATEMAP_FIXED, 7, 0) = 0xb7131000
  mmap2(0xb7141000, 65536, PROT_READPROT_WRITE, MAP_PRIVATEMAP_FIXED, 7, 0) = 0xb7141000
  mmap2(0xb7151000, 65536, PROT_READPROT_WRITE, MAP_PRIVATEMAP_FIXED, 7, 0) = 0xb7151000
  mmap2(0xb7161000, 65536, PROT_READPROT_WRITE, MAP_PRIVATEMAP_FIXED, 7, 0) = 0xb7161000
  
  同時可以看到內存分配是通過mmap來實現的
  
  alter system set "_use_realfree_heap"=false;

  
  ALTER SESSION SET EVENTS
  'immediate trace name heapdump level 1';
  
  HEAP DUMP heap name="pga heap" desc=0xc6a6400
  extent sz=0x206c alt=92 het=32767 rec=0 flg=3 opc=3
  parent=(nil) owner=(nil) nex=(nil) xsz=0x206c
  EXTENT 0 addr=0xc74a7b8
  Chunk c74a7c0 sz=   8292  free   "        "
  EXTENT 1 addr=0xc748740
  Chunk c748748 sz=   4148  free   "        "
  Chunk c74977c sz=   4144  freeable "session heap  " ds=0xc73332c
  
  當_use_realfree_heap為true時,uga,cga為pga的subheap
  
  strace -p xxxx -o 2.txt
  
  brk(0xc7fb000)             = 0xc7fb000
  brk(0xc823000)             = 0xc823000
  brk(0xc852000)             = 0xc852000
  brk(0xc881000)             = 0xc881000
  brk(0xc8b1000)             = 0xc8b1000
  brk(0xc8e0000)             = 0xc8e0000
  brk(0xc90f000)             = 0xc90f000
  brk(0xc93f000)             = 0xc93f000
  brk(0xc96e000)             = 0xc96e000
  brk(0xc99d000)             = 0xc99d000
  
  同時可以看到內存分配是通過brk來實現的
  
  我們再來看一下在_use_realfree_heap不同設置下uga,pga的內存使用情況
  
  _use_realfree_heap=true
  
  SQL 10G>select * from testsort order by 1,2,3;
  
  398608 rows selected.
  
  SQL 10G>/
  
  NAME                               MEM
  ---------------------------------------------------------------- -----------------------------------------
  session uga memory                        1.8679962158203125M
  session uga memory max                      49.53220367431640625M
  session pga memory                        4.808185577392578125M
  session pga memory max                      62.308185577392578125M
  
  SQL 10G>/
  
  NAME                               MEM
  ---------------------------------------------------------------- -----------------------------------------
  session uga memory                        49.78192901611328125M
  session uga memory max                      49.78192901611328125M
  session pga memory                        52.808185577392578125M
  session pga memory max

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 科尔| 苗栗县| 宜黄县| 乐清市| 金堂县| 涿州市| 牡丹江市| 连州市| 西乌珠穆沁旗| 安西县| 淮安市| 绥滨县| 高阳县| 丰原市| 舞阳县| 福州市| 噶尔县| 监利县| 烟台市| 云林县| 饶河县| 丰原市| 舒兰市| 江口县| 北辰区| 常宁市| 会东县| 宜宾县| 汉沽区| 天津市| 青浦区| 招远市| 木里| 六盘水市| 北海市| 浑源县| 澄江县| 佛坪县| 论坛| 阿拉善右旗| 志丹县|