ORACLE 體系結構--內存結構

ORACLE內存結構包括兩個部分:
        系統全局區 (SGA): 在實例啓動的時候分配, 是Oracle實例的基礎組件
        程序全局區 (PGA): 當服務器進程產生時分配


系統全局區包括以下幾個部分:
        共享池
        數據緩衝區
        重做日誌緩衝區 ,其他 (例如 statistical data)
    和兩個額外的內存結構:
        大池
        Java池
        流池
<系統全局區>
        動態的
        由參數SGA_MAX_SIZE決定大小(在32位系統中,SGA有1.7G的限制)
<共享池(由庫緩存和數據字典緩存組成)>
        用於存儲:
                最近執行的SQL語句
                最近使用的數據定義
                由兩個與性能相關的部分組成:
                        庫緩存
                        數據字典緩存
                        其中各自的大小由共享池內部指定


                由參數SHARED_POOL_SIZE決定大小           
                show parameter shared_pool_size
                alter system set shared_pool_size=100m;
               查看共享池的使用情況
                SQL> select pool,sum(bytes) from v$sgastat group by pool;
                SQL> select pool,name,bytes from v$sgastat where name='free memory';


            查看共享池的自由空間
                 select pool,name,bytes/1024/1024 from v$sgastat where name='free memory';
            刷新共享池(商用環境不建議執行此命令、除非有指示)
                SQL> alter system flush shared_pool;
共享池過小可能會造成實例無法啓動
共享池究竟設多大達到最優呢,可藉助共享池的內存顧問要查看,前提是要開啓統計信息
                SQL> show parameter statistics 
                NAME                      TYPE        VALUE
                ----------------------------------------------------
                statistics_level          string      TYPICAL   此處爲typical或all時,共享池顧問才能使用。
                timed_os_statistics       integer     0
                timed_statistics          boolean     TRUE
        SQL> desc v$shared_pool_advice;
         Name                                  
         --------------------------------
         SHARED_POOL_SIZE_FOR_ESTIMATE           估計的共享池大小,以MB爲單位      
         SHARED_POOL_SIZE_FACTOR                 估計的共享池大小與當前共享池的比值
         ESTD_LC_SIZE                            估計的共享池中用於庫緩存的大小,以MB爲單位
         ESTD_LC_MEMORY_OBJECTS       估計的共享池中庫緩存中的對象數
         ESTD_LC_TIME_SAVED           可以節省的解析時間
         ESTD_LC_TIME_SAVED_FACTOR    可以節省的解析時間與當前共享池所需花費的解析時間的比值
         ESTD_LC_LOAD_TIME            解析對象所需花費的時間
         ESTD_LC_LOAD_TIME_FACTOR     ESTD_LC_LOAD_TIME與當前大小共享池解析對象花費時間的比值
         ESTD_LC_MEMORY_OBJECT_HITS   估計的共享池大小時,共享池中對象的命中次數


       SQL> select SHARED_POOL_SIZE_FOR_ESTIMATE "SP",ESTD_LC_SIZE "EL",
                        ESTD_LC_MEMORY_OBJECTS "ELM",ESTD_LC_TIME_SAVED "ELT",
                         ESTD_LC_TIME_SAVED_FACTOR AS "ELTS", 
                        ESTD_LC_MEMORY_OBJECT_HITS AS "ELMO"
                          FROM V$SHARED_POOL_ADVICE;


                     SP         EL     ELM       ELT     ELTS                ELMO
                        -----------------------------------------------------
                               64       19     2172     162      .9818           21093
                               80        33     3714     165      1              21703
                               96        37     4543     165      1              21708
                               112       37     4543     165      1              21708
                               128       37     4543     165      1              21708
                               144       37     4543     165      1              21708
                               160       37     4543     165      1              21708
         從這裏可以看到共享池設爲80MB達到最優(此處的ELTS爲1),再大的話也是浪費,小的
                話影響性能。
                       
        <庫緩存>
                存儲最近使用的SQL和PL/SQL語句的信息
                共享最常用的語句
                管理上遵循LRU規則(最近最少使用)




                包括兩個部分:                
                        共享SQL區
                        共享PL/SQL區
                大小由Shared Pool的大小決定,不能直接設置庫緩存的大小。
          
                要想共享SQL或PL/SQL語句:第一,庫緩存要足夠大,因爲只有這樣,要共享的SQL或PL/SQL
                纔不會很快地淘汰出內存;第二,SQL或PL/SQL語句要是能共享的通用代碼,因爲ORACLE是
                通過比較SQL或PL/SQL語句的正文來決定兩個語句是否相同的,只有當兩個語句的正文完全相
                同時,ORACLE才重用已存在的編譯後的代碼和執行計劃。如,以下兩個SQL是不相同的
                SELECT * FROM emp WHERE sal >=1500;和
                SELECT * FROM emp WHERE sal >=1501;是不相同的
        查看共享池的一些緩存信息:
                select * from v$db_object_cache;
       查看庫緩存的命中率:
                select sum(pinhits)/sum(pins) from v$librarycache;
                        SUM(PINHITS)/SUM(PINS)
                        ----------------------
                            .838034828
       確定庫高速緩存的效率:
                SQL> SELECT namespace,pins,pinhits,reloads FROM v$librarycache ORDER BY namespace;


                NAMESPACE             PINS    PINHITS    RELOADS   
                --------------- ---------- ---------- ----------
                BODY                  2195       2117          0
                CLUSTER                285        277          0
                INDEX                   57          0          0
           --如果RELOADS比較大的話,表示許多SQL語句在老化退出後又被重新裝入庫池。
             -----------------
                綁定變量的使用:
                SQL> select count(*) from v$sql;
                  COUNT(*)
                ----------
                      1262


               SQL> select sql_text from v$sql where sql_text like 'SELECT * FROM SCOTT%';
                SQL_TEXT
                --------------------------------------------
                SQL> SELECT * FROM SCOTT.EMP WHERE EMPNO=7788;
                SQL> SELECT * FROM SCOTT.EMP WHERE EMPNO=7839;


                SQL> select count(*) from v$sql;
                  COUNT(*)
                ----------
                      1264


                SQL> select sql_text from v$sql where sql_text like 'SELECT * FROM SCOTT%';
                SQL_TEXT
                --------------------------------------------
                SELECT * FROM SCOTT.EMP WHERE EMPNO=7788
                SELECT * FROM SCOTT.EMP WHERE EMPNO=7839


                SQL> VARIABLE bindvar NUMBER;
                SQL> BEGIN
                  2  :bindvar:=7369;
                  3  END;
                  4  /


                SQL> SELECT * FROM scott.emp WHERE empno=:bindvar;
            ------------------


        將對象釘在共享池中:
                SQL> EXECUTE SYS.DBMS_SHARED_POOL.KEEP(object_name,object_type);


        <數據字典緩存>
                
                存儲在數據庫中數據文件,表,索引,列,用戶和其它的數據對象的定義和權限信息
                大小由Shared Pool的大小決定,不能單獨指定


注:即使把共享池設得足夠大且所使用的SQL或PL/SQL語句是能共享的,ORACLE也並不能一
                定使用內存(共享池)中的代碼。例如當有用戶修改了某個對象的定義後,所有使用這個對象
                的內存(共享池)中的代碼全部被ORACLE設置爲無效,因此在使用時必須重新編譯。
   
        <數據緩衝區>
                存儲從數據文件中獲得的數據塊的鏡像
                當獲取和更新數據的時候能夠大幅度的提高性能
                管理上遵循LRU規則
                9I之前使用 DB_BLOCK_SIZE和 DB_BLOCK_BUFFERS兩個參數來設置數據庫高速緩衝區大小
                DB_BLOCK_SIZE的值是在創建數據庫時設置定的,如果要改變該參數的值一般需要重建數據庫


              其中:
                        DB_BLOCK_SIZE        ORACLE數據塊(內存緩衝區)的大小,ORACLE中內存和外 存的數據塊大小是相同的
                        DB_BLOCK_BUFFERS        內存緩衝區的個數,數據緩衝區大小爲這兩個參數的積。


                顯示參數DB_BLOCK_SIZE其塊的大小
        
                SQL> show parameter db_block_size
        
                NAME                                 TYPE        VALUE
                ------------------------------------ ----------- ----------
                db_block_size                        integer     8192




                select * from v$sgainfo;
                NAME                                  BYTES RES
                -------------------------------- ---------- ---
                Fixed SGA Size                      1220580 No
                Redo Buffers                        7168000 No
                Buffer Cache Size                 348127232 Yes
                Shared Pool Size                  197132288 Yes
                Large Pool Size                     4194304 Yes
                Java Pool Size                      4194304 Yes
                Streams Pool Size                   4194304 Yes
                Granule Size                        4194304 No
                Maximum SGA Size                  566231040 No
                Startup overhead in Shared Pool    41943040 No
                Free SGA Memory Available                 0


                ORACLE 9i 及以後,引入另一個參數 DB_CACHE_SIZE 這個動態參數,可以數據庫運行時
                動態修改該參數。


                包括以下獨立的子緩存:
                DB_CACHE_SIZE
                DB_KEEP_CACHE_SIZE
                DB_RECYCLE_CACHE_SIZE
                能夠動態的調整大小
                
                alter system set db_cache_size=100m;                
                alter system set db_keep_cache_size=12m;
                alter system set db_recycle_cace_size=16m;
                select component,current_size from v$sga_dynamic_components;


                刷新數據緩衝區:
                SQL> alter system flush buffer_cache;


查看db_cache的命中率:


                SQL> select name,value from v$sysstat where name in 
                        ('db block gets from cache','consistent gets from cache',
                        'physical reads cache');


                NAME                                                                  VALUE
                ---------------------------------------------------------------- ----------
                db block gets from cache                                               3868
                consistent gets from cache                                            73179
                physical reads cache                                                   7061


                db_cache命中率=1-(physical reads cache/(db block gets from cache+
                                        consistent gets from cache))


    也可以:
        SQL> SELECT name,physical_reads,db_block_gets,consistent_gets,
          1-(physical_reads/(db_block_gets+consistent_gets)) "HitRation"
          FROM v$buffer_pool_statistics;




                NAME                 PHYSICAL_READS DB_BLOCK_GETS CONSISTENT_GETS  HitRation
                -------------------- -------------- ------------- --------------- ----------
                DEFAULT                        8993         23945          234148 .965155971
        
        注意: 
                keep是存取你要保留時間長的 比如經常訪問的索引和小表 
                recycle是FTS多的大表就是你不希望保留時間長的 ,要及時回收再利用的


                keep也是使用LRU,但由於缺省情況下,數據塊是被緩存到普通的cache中,
                因此被指定換存到keep區的數據塊就不太可能因爲執行其他一些操作被其他數據塊交換出,
                即使較長時間沒使用了。 


                而設置recycle是因爲有時會有一些大的又少使用的表的操作,
                如果不設置單獨的緩存區,那麼缺省的緩存區中的數據塊就被這些偶爾使用的數據換出。
                設置recycle後(通常recycle都是比較小的),將大的又較少使用的數據放到recycle中,
                可以減少缺省緩存區中頻繁使用的數據塊的換出換入的操作。 
                可以這樣理解,keep區中的數據是最最頻繁使用的,或者屬於那些需要最快相應時間操作
                的數據。
                recycle是偶爾使用的數據的緩存區。其他數據都被緩存在缺省區。


        將數據放到 DB_KEEP_CACHE
                CREATE table test2 (n number) storage(buffer_pool keep)                
                alter table scott.dept storage(buffer_pool keep)                
                select segment_name,buffer_pool from dba_segments where buffer_pool='KEEP';
        
        從DB_KEEP_CACHE 移去:
                alter table scott.dept storage(buffer_pool default)
        
        內存緩衝區顧問 (V$DB_CACHE_ADVICE)
                ORACLE 9i開始提供的一個工具,用來幫助獲得調整數據庫調整緩衝區的統計信息。內存緩衝
                區顧問一共有3種狀態。


        SQL> show parameter db_cache_advice;


        NAME                                 TYPE        VALUE
        ------------------------------------ ----------- -------------
        db_cache_advice                      string      ON


                (1)ON        工具打開,爲該工具分配內存並進行統計信息的收集,要有一定的內存和CPU開銷。
                (2)READY      工具打開,爲該工具分配內存但不進行統計信息的收集,因此沒有CPU開銷。
                (3)OFF        工具關閉。
        
            查看 V$DB_CACHE_ADVICE 狀態
                SQL> select name,block_size,advice_status from v$db_cache_advice;


                NAME                 BLOCK_SIZE ADV
                -------------------- ---------- ---
                DEFAULT                    8192 ON
                DEFAULT                    8192 ON


            修改其狀態
                SQL> ALTER SYSTEM SET DB_CACHE_ADVICE = OFF;


      查看數據緩衝區的最佳大小:


        SQL> desc v$db_cache_advice;
         Name                             
         ---------------------------------
         ID                               緩衝區編號,1-6分別對應2-32K db_cache_size
                                                7是db_keep_cache_size 8是db_recycle_cache_size
         NAME                             緩衝區名字
         BLOCK_SIZE                       塊大小
         ADVICE_STATUS                    建議的狀態
         SIZE_FOR_ESTIMATE                估計的緩衝區大小,MB爲單位
         SIZE_FACTOR                      與當前數據緩衝區的比值
         BUFFERS_FOR_ESTIMATE             估計的緩衝區大小,塊爲單位
         ESTD_PHYSICAL_READ_FACTOR        物理讀與當前實際物理讀的比值,越小越好,爲0時顯示爲空
         ESTD_PHYSICAL_READS              物理讀數
         ESTD_PHYSICAL_READ_TIME          響應時間
         ESTD_PCT_OF_DB_TIME_FOR_READS        物理讀磁盤消耗時間百分比                 
         ESTD_CLUSTER_READS                   讀取數據塊總數,僅對RAC有效
         ESTD_CLUSTER_READ_TIME                  讀取花費的總時間,僅對RAC有效


        SQL> SELECT SIZE_FOR_ESTIMATE "SIZE",BUFFERS_FOR_ESTIMATE "BUFFERS",
             ESTD_PHYSICAL_READ_FACTOR "READ_FACTOR", ESTD_PHYSICAL_READS "READS" 
             FROM V$DB_CACHE_ADVICE                                                     
             WHERE NAME='DEFAULT' AND BLOCK_SIZE=
             (SELECT VALUE FROM V$PARAMETER WHERE NAME='db_block_size');




                      SIZE    BUFFERS READ_FACTOR      READS
                ---------- ---------- ----------- ----------
                        16       2002                      0
                        32       4004                      0
                        48       6006                      0
                        64       8008                      0
                        80      10010                      0
                        96      12012                      0
                       112      14014                      0
                       128      16016                      0
                       144      18018                      0
                       160      20020                      0
                       176      22022                      0
                       192      24024                      0
                       208      26026                      0
                       224      28028                      0
                       240      30030                      0
                       256      32032                      0
                       272      34034                      0
                       288      36036                      0
                       304      38038                      0
                       320      40040                      0


        第三列爲空時,則表示內存裏的邏輯讀沒有引起物理讀,當前的DB_CACHE夠用,非常好
        爲1的話,當示當前值,其它的行的值爲相對於當前值的比率,當然是越低越好。


<重做日誌緩衝區〉
        記錄所有數據庫的塊改變
        主要的目的是用於恢復
        大小由參數LOG_BUFFER決定


        SQL> show parameter log_buffer


        NAME                                 TYPE        VALUE
        ------------------------------------ ----------- ----------
        log_buffer                           integer     7028736


        查看log_buffer是否需要調整:
        select name,value from v$sysstat 
        where name='redo buffer allocation retries';


       NAME                                                                  VALUE
        ---------------------------------------------------------------- ----------
        redo buffer allocation retries                                            2


        接近於0時不需要調整


        調整時改參數文件
         或alter system set log_buffer=10057408 scope=spfile;


<大池>
        是系統全局區中可選的一個部分
        減輕在共享池中的負擔
        用於:
                共享服務器進程的PGA大部分放入Large pool(stack space除外)
                大規模的I/O
                備份恢復操作或者是使用RMAN
                不使用LRU規則
                大小由參數LARGE_POOL_SIZE決定


        能夠被動態的改變大小


        SQL> show parameter large_pool_size


        NAME                                 TYPE        VALUE
        ------------------------------------ ----------- -----------
        large_pool_size                      big integer 0


        SQL> alter system set large_pool_size=10m;


        爲了監視大池的使用,可用以下查詢來做
        SQL> select * from v$sgastat where pool='large pool';


<Java池〉
        使用java語言,Java命令的分析需要使用
        大小由參數JAVA_POOL_SIZE決定


        SQL> show parameter java_pool_size
        NAME                                 TYPE        VALUE
        ------------------------------------ ----------- -------------------
        java_pool_size                       big integer 0


        SQL> alter system set java_pool_size=10m;


        同時還有以下幾個參數:
                SQL> show parameter java
                NAME                                 TYPE        VALUE
                ------------------------------------ ----------- ------------------------------
                java_max_sessionspace_size           integer     0
                java_pool_size                       big integer 0
                java_soft_sessionspace_limit         integer     0


        爲了監視JAVA池的使用,可用以下查詢來做
                SQL> select * from v$sgastat where pool='java pool';
        如何將SGA鎖定在物理內存中(ORACLE會把一部分SGA放到虛擬內存中,這樣比較慢):


        show parameter lock_sga;
        NAME                                 TYPE        VALUE
        ------------------------------------ ----------- ------------------------------
        lock_sga                             boolean     FALSE
        alter system set lock_sga=true scope=spfile;

        ORACLE 9i 以後的版本,SGA是動態的。SGA中內存緩衝區,可動態的增減,ORACLE是利用所謂
        的區組(granule)來管理SGA內存的。區組就是一片連續的虛擬內存區,是ORACLE分配和回收內存
        的基本單位。在 v$sgainfo或v$sga_dynamic_components中可看到該大小。


ASMM
        ORACLE中各部分內存的設置非常麻煩,爲了減輕DBA的工作負責
        ORACLE10G中引進了一個ASMM(自動共享內存管理),DBA只需初始化參數SGA_TARGET,
        ORACLE就會自動對SGA的共享池、JAVA池、大池、數據庫高速緩衝區進行自動調整。
        但是無法自動調整DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE,LOG_BUFFER、流池。
       sga_target爲O(最大不能超過sga_max_size)時,則取消自動共享內存管理,各部分需要手工設定。


        當然ASMM工作的前提是,statistics_level 爲typical或 all,否則無收集MMAN進程所需的信息。


        查看SGA大小:show parameter sga_max_size
        
        動態分配後如何查看各內存區大小:
                select * from v$sgainfo
                select component,current_size from v$sga_dynamic_components;
                select * from v$sgastat;


        SGA空間的分配不是以MB爲單位,而是以粒度 granule ['gr??nju:l] 爲單位。通常如果SGA大小
        不超過1G,此值大小一般爲4M,如果大於1G(另一說爲128M,但實際爲1G),那麼爲16M。不同平臺會有所變化,
        WINDOWS中SGA大小超過1G,區組大小爲8M。


<程序全局區〉
        爲每個用戶進程連接Oracle數據庫保留的內存
        當進程創建時分配
        進程結束後被釋放
        只能被一個進程使用
        APMM(自動PGA內存管理):


        參數PGA_AGGREGATE_TARGET指定PGA的總共大小 (啓用的前提是workarea_size_policy爲auto)
        SQL> show parameter workarea_size_policy;
        NAME                                 TYPE        VALUE
        ------------------------------------ ----------- -----------
        workarea_size_policy                 string      AUTO


        當ORACLE創建一個服務器進程的同時,要爲這個服務器進程分配一個內存區,該區就稱爲程序全
        局區(PGA),與SGA不同,PGA是一個私有的內存區,不能共享,且只屬於一個進程。它隨進程的創建
        而被分配,隨進程的終止而被回收。在專用服務器進程的配置情況下,程序全局區包括了以下結構:
        (1)排序區:用於處理SQL語句所需的排序
        (2)遊標狀態區:用於指示會話當前所使用的SQL語句的處理狀態
        (3)會話信息區:包括了傳話的用戶權限和優化統計信息
        (4)堆棧區:包括了其他的會話變量。
        如果是共享服務器進程或多線程的配置,以上這些結構除了堆棧區外大部分都存在於SGA中,如果
        有LARGE POOL,存放於Large pool中,否則它們會被存放於共享池中。
        
        SQL> show parameter pga_a
        NAME                                 TYPE        VALUE
        ------------------------------------ ----------- -------
        pga_aggregate_target                 big integer 91M


        SQL> alter system  set  pga_aggregate_target=100m;


                sga_target           實例一啓動便獲取指定數量的內存
                pga_aggregate_target 內存分配不夠時,才獲取


查看PGA詳細情況,通過這兩個查詢可看到當前PGA的使用情況,PGA是否夠用,從而爲優化做參考:
        select * from v$pgastat;  --其中有PGA的命中率
        select * from v$pga_target_advice;


        注:要在系統運行了一段時間後,看纔是最準確的,空閒時,可能都會顯示夠用的數據。
        PGA最大大小爲4G


查看每個用戶的PGA分配情況:
        SQL> select s.value,s.sid,a.username
          from v$sesstat s,v$statname n,v$session a
          where n.statistic#=s.statistic# and name='session pga memory'
          and s.sid=a.sid order by s.value;


通過內存顧問查看當前最優的PGA設置:
        SQL> desc v$pga_target_advice;
         Name                             
         ---------------------------------
         PGA_TARGET_FOR_ESTIMATE    估計的pga_aggregate_target的參數值
         PGA_TARGET_FACTOR          與當前pga_aggregate_target的比值
         ADVICE_STATUS              是否收集統計信息,以計算建議值,ON啓用,OFF禁用
         BYTES_PROCESSED            預估操作的字節數
         ESTD_EXTRA_BYTES_RW        當pga_aggregate_target參數值爲估計值是,需額外處理的字節數
         ESTD_PGA_CACHE_HIT_PERCENTAGE        爲估計值時,PGA的緩存命中率,計算公式爲:
                                        BYTES_PROCESSED/(BYTES_PROCESSED+ESTD_EXTRA_BYTES_RW)        
         ESTD_OVERALLOC_COUNT       爲估計值時,需額外分配的PGA內存,爲非0時,說明還太少。


        SQL> SELECT ROUND(PGA_TARGET_FOR_ESTIMATE/1024/1024) "PGATARGET SIZE(M)", 
           ESTD_PGA_CACHE_HIT_PERCENTAGE "EST.CACHE HIT%",
           ROUND(ESTD_EXTRA_BYTES_RW/1024/1024) "EST.RW(M)",
           ESTD_OVERALLOC_COUNT "EST.OVER-ALLOC"
           FROM V$PGA_TARGET_ADVICE;
  
        PGATARGET SIZE(M) EST.CACHE HIT%  EST.RW(M) EST.OVER-ALLOC
        ----------------- -------------- ---------- --------------
                       24            100          0              0
                       48            100          0              0
                       96            100          0              0
                      143            100          0              0
                      191            100          0              0
                      229            100          0              0
                      267            100          0              0
                      306            100          0              0
                      344            100          0              0
                      382            100          0              0
                      573            100          0              0
                      764            100          0              0
                     1146            100          0              0
                     1528            100          0              0
 要求是第二列(辦求最大)和第三列(力求最小)之間的平衡,而獲取到的第一列值,
        從當前看PGA 24M 已足夠,再多也是浪費。


For OLTP 系統
        PGA_AGGREGATE_TARGET = (<Total Physical Memory > * 80%) * 20% 
For DSS 系統 
        PGA_AGGREGATE_TARGET = (<Total Physical Memory > * 80%) * 50% 


內存信息的獲取:
        SHOW PARAMETER                        顯示所有參數信息
        SHOW PARAMETER SGA_MAX_SIZE        顯示單個參數值
        SELECT * FROM v$parameter
        SELECT * FROM v$spparameter


ORACLE執行SQL查詢語句的步驟:
        SQL語句的執行主要由用戶進程與服務器進程來完成,其他的一些進程可能要輔助完成這一過程。
        查詢語句與其它的SQL語句有所不同,如果一個查詢語句執行成功,就要返回查詢的結果,而其它
        的SQL語句只是返回執行成功或失敗的信息。查詢語句的處理主要包括以下3個階段:編譯、執行和
        提取數據。
    
        編譯:在進行編譯時,服務器進程會將SQL語句的正文放入共享池的庫高速緩存中並將完成以下處理。
          首先在共享池中搜索是否有相同的SQL語句(正文),如果沒有就進行後續處理。
                檢查該SQL語句的語法是否正確
                通過查看數據字典來檢查表和列的定義
                對所操作的對象加編譯鎖,以便在編譯語句期間這些對象的定義不能被改變
                檢查所引用對象的用戶權限
                生成執行該SQL語句所需的優化執行計劃
                將SQL語句和執行計劃裝入共享的SQL區
        執行
        提取數據
  
〈進程結構〉
Oracle有以下幾種進程:
        用戶進程: 在用戶連接數據庫時產生
        服務器進程: 當連接到Oracle實例並且用戶建立會話的時候產生
        後臺進程: Oracle實例啓動的時候產生


<用戶進程>
        用戶進程是要與 Oracle 服務器交互的一種進程
        必須要先建立一個連接
        不會直接和Oracle服務器聯繫


<服務器進程>
        服務進程是直接和 Oracle 服務器交互的一段程序. 
        它響應用戶要求,向服務器發起呼叫並返回結果給用戶.
        可用專用服務器模式,也可用共享服務器模式創建對話.


<後臺進程>
        維持物理和內存之間的關聯:
        必須要有的後臺進程:
                DBWn(數據庫寫)              PMON(進程監控)                CKPT(檢查點)
                LGWR(日誌寫)                SMON(系統監控)                
        可選的後臺進程:
                ARCn(歸檔)                    
                RECO(恢復)
                Snnn                                                
                Pnnn
查看數據庫中有哪些後臺進程:
        select * from v$bgprocess where paddr<>'00';或 ps -ef | grep ora_
   
數據庫寫進程 (DBWn),負責把緩衝區的數據寫到磁盤,通常一個DBWn能滿足需求,爲提高性能,可
配置多個DBWn進程。


        DBWn的觸發條件:
                發生檢查點
                髒緩存到達限制
                沒有自由的緩存
                超時發生
                RAC ping請求 
                表空間離線
                表空間只讀
                表被刪除或者截斷
                開始備份表空間
增加數據庫寫進程數量(最多10個,基於CPU數量的,設多了,也只一個進程有效):
                vim  pfile
                        DB_WRITER_PROCESSES=x 或 alter system set DB_WRITER_PROCESSES=3 scope=spfile;


日誌寫進程 (LGWR):
        LGWR寫的條件:
            提交的時候
            達到三分之一滿了
            日誌的大小到1M
            每隔三秒
            在DBWn進程寫之前


系統監測進程 (SMON):
        作用:
            實例恢復
            前滾所有重做日誌中的改變(即數據已經提交了,但還沒往數據文件裏寫完就斷電了,要重新應用一次日誌)
            打開數據庫爲了用戶能訪問
            回滾沒有提交的事務
            接合自由的空間
            釋放臨時表空間


進程監測進程 (PMON):
        清除失敗的進程:        
回滾事務、釋放鎖、釋放其他資源
        重啓死 dispatchers


檢查點進程 (CKPT):
        作用:
            給信號給DBWn
            更新數據文件頭 
            更新控制文件
        如何將檢查點信息寫入警告文件:
                 alter system set log_checkpoints_to_alert=true;


歸檔進程 (ARCn):
        可選的後臺進程
        當啓用歸檔方式後自動歸檔重做日誌文件
        修改歸檔進程數量:
                alter system set log_archive_max_processes = 4;


<數據庫邏輯結構>
        表明數據庫的物理空間如何使用
        分爲表空間,段,範圍,塊


修改系統進程數量:
        不能動態修改(不會報錯,但也不會起作用,要修改參數文件,再將參數文件轉換成服務器參數文件)
        vim pfile
        processes=300
        create spfile from pfile


提高oracle的最大會話數
        oracle最大會話數由初始化能數processes控制的,並不是由sessions控制,初始化參數sessions
        的值由processes衍生出來的session默認等於 1.1 * processes +5
        show parameter session

查當前有哪些會話:
         select * from v$session where type='USER';
還可查用戶test從哪臺機器登錄的:        
殺掉一個進程:
        alter system kill session 'SID,SERIAL#';
        殺掉後server爲pseudo
        最好用操作系統來殺kill當一個活動的進程正在執行網絡I/O、回滾事務、導入導出等操作時,不能殺掉的,只有等這些操作完成後,才能殺掉


查看ORACLE進程與操作系統進程的對應關係
        v$process視圖中有關於每個進程的信息,包括其操作系統進程號
SQL> select addr,pid,spid,username,program from v$process;
ADDR            PID SPID         USERNAME        PROGRAM
        -------- ---------- ------------ --------------- ------------------------------------------------
        5E61628C          1                              PSEUDO    --數據庫的初始化進程
        5E616840          2 3405         oracle          [email protected] (PMON)
        5E616DF4          3 3407         oracle          [email protected] (PSP0)
        5E6173A8          4 3409         oracle          [email protected] (MMAN)
        5E61795C          5 3411         oracle          [email protected] (DBW0)
        5E617F10          6 3413         oracle          [email protected] (LGWR)
        5E6184C4          7 3415         oracle          [email protected] (CKPT)
        5E618A78          8 3417         oracle          [email protected] (SMON)
        5E61902C          9 3419         oracle          [email protected] (RECO)
        5E6195E0         10 3421         oracle          [email protected] (CJQ0)
        5E619B94         11 3423         oracle          [email protected] (MMON)
        5E61A148         12 3425         oracle          [email protected] (MMNL)
        5E61A6FC         13 3427         oracle          [email protected] (D000)
      
        [oracle@James007 ~]$ ps -ef |grep ora_
        oracle    3405     1  0 09:19 ?        00:00:00 ora_pmon_orcl
        oracle    3407     1  0 09:19 ?        00:00:00 ora_psp0_orcl
        oracle    3409     1  0 09:19 ?        00:00:00 ora_mman_orcl
        oracle    3411     1  0 09:19 ?        00:00:00 ora_dbw0_orcl
        oracle    3413     1  0 09:19 ?        00:00:00 ora_lgwr_orcl
        oracle    3415     1  0 09:19 ?        00:00:00 ora_ckpt_orcl
        oracle    3417     1  0 09:19 ?        00:00:01 ora_smon_orcl
        oracle    3419     1  0 09:19 ?        00:00:00 ora_reco_orcl
        oracle    3421     1  0 09:19 ?        00:00:00 ora_cjq0_orcl
        oracle    3423     1  0 09:19 ?        00:00:01 ora_mmon_orcl
        oracle    3425     1  0 09:19 ?        00:00:00 ora_mmnl_orcl
        oracle    3427     1  0 09:19 ?        00:00:00 ora_d000_orcl
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章