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

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

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

    cAng^Er

    不懂我的人 , 離不了我 , 該了解了解我 !而懂我的人 , 更離不了我 , 因為他們愛我 。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      30 隨筆 :: 16 文章 :: 18 評論 :: 0 Trackbacks
    原文:http://space.itpub.net/79499/viewspace-341794

    .簡介:數據庫調整中最為重要的一部分是重寫運行效率差的SQL代碼,重寫之后的SQL代碼在運行效率方面可能會與之前的產生極大的差別!
          
    但是當遇到重寫之后性能還是未能突破瓶頸或者你是用戶(無法訪問SQL代碼)的時候,可以通過調整ORACLE的共享內存結構SGA(System Global Area),最大限度地提高性能!
           SGA
    中比較重要的組件就是Shared Pool(共享池),它的作用就是高速緩存SQL語句!共享池由一個最近最少使用(LRU,Least Recently Used)算法來管理!
          
    共享池的好處:
    1.select cust_id,cust_name from col_cust
    2.
    上列語句的算法被轉換成ASCII,然后通過一個散列算法產生一個單獨的散列值~~接著Process會查看該散列值在Shared Pool中是否存在,
    如果存在,就執行高速緩存中語句
    3.
    如果不存在,就必須對該語句進行語法分析,這些分析步驟會產生額外的系統開銷,該操作是高代價的!
    4.
    查找到匹配的SQL叫做一次高速緩沖區命中(Cache Hit)
    5.
    反之叫做高速緩沖區脫靶(Cache Miss)
    6.
    注意是區分大小寫的
     SELECT CUST_ID,CUST_NAME FROM COL_CUST 
     
          
    .共享池有三個組件組成,Library Cache(庫高速緩存區),Data Dictionary Cache(數據目錄高速緩存區),User Global Area(用戶全局區)
          1.Library Cache(
    庫高速緩存區)是用來緩存SQL語句的場所.可以通過下面這句話對動態視圖進行查詢,檢查Library Cache的內容
     select p.username,l.sql_text,
     lpad(' ' ,4*(LEVEL-2)) || operation || ' ' || options || ' ' || object_name as "Execution Plan"
     from (
     select s.username,p.address,p.hash_value,p.operation,p.options,p.object_name,p.id,p.parent_id
     from v$sql_plan p,v$session s
     where (p.address=s.sql_address and p.hash_value=s.sql_hash_value) and s.username='citictest'
     ) p,v$sql l
     where(l.address=p.address and l.hash_value=p.hash_value)
     start with id=0
     connect by prior id = parent_id
          2.Data Dictionary Cache(
    數據目錄高速緩存區):數據目錄是用來檢查SQL語句所引用的那些表是否已經存在,列名和數據類型是否也正確! Library CacheData Dictionary Cache使用互相獨立的LRU機制,好處是后續用戶發布的語句與先前用戶所發布的語句類似但不一致,雖然在Library Cache中無法找到匹配的,但是在數據目錄中會存在,也會有性能上的提高。

          
    .(1)測量Library Cache(庫高速緩存區)的性能
          select namespace,gethitratio,pinhitratio,reloads,invalidations
           from v$librarycache
           where namespace in ('SQL_AREA','TABLE/PROCEDURE','BODY','TRIGGER');
    主要看gethitratio,pinhitratio>90%說明調整充分
          select sum(reloads)/sum(pins) "RELOAD RATIO"
           from v$librarycache
    <1%意味著不是經常重新語法分析以前被裝載到Library Cache的語句
     
           (2)
    測量Data Dictionary Cache(數據目錄高速緩存區)的性能
          select 1 - (sum(getmisses)/sum(gets)) "DATA DICTIONARY HIT RATIO"
           from v$rowcache;
    >85%時說明調整充分
       .通過改進Library CacheData Dictionary Cache來提高shared pool性能
    (1).
    得到當前shared pool的大小
     select pool,sum(bytes) "SIZE" from v$sgastat where pool='shared pool' group by pool;
    (2).
    得到推薦的shared pool大小
      set echo off
      set feedback off
      set serveroutput on
      declare
      v_total_plsql_mem number := 0;
      v_total_sql_mem   number := 0;
      v_total_sharable_mem number := 0;
      begin
           select sum(sharable_mem) into v_total_plsql_mem from v$db_object_cache;
          
           select sum(sharable_mem) into v_total_sql_mem from v$sqlarea where executions > 10;
          
           v_total_sharable_mem := v_total_plsql_mem + v_total_sql_mem;
          
           Dbms_Output.put_line('Estimated required shared pool size is:' || to_char(v_total_sharable_mem,'fm9,999,999,999,999') || ' bytes');
      end;
      /
    (3).
    動態加大shared pool大小
    alert system set shared_pool_size = 200M;
    *
    大小不能超過SGA_MAX_SIZE的值
    (4).
    初始SGA大小的計算
    (TSGA)SGA
    總的大小=服務器物理內存*0.55   (1G以上物理內存的話可以相應60%-75%)
    (TSGAI)
    每個實例的總SGA大小=TSGA/oracle上實例的個數
    shared pool
    的總內存=TSGAI*0.45
    (5).
    上述四點是其實完成的是同一個做法,就是使Shared Pool更大
    (6).
    可以將PL/SQL程序包裝入Shared Pool Reserved Area(共享池保留區)
    Shared_Pool_Reserved_Size
    用來設置這一區域的大小,默認是5%,這是不夠的
    select owner,name,sharable_mem from v$db_object_cache
    where type in('PACKAGE','PACKAGE BODY') order by sharable_mem desc;
    上述這句語句可以查看當前緩存區中的PL/SQL程序包的名稱和大小,當發現大小> Shared_Pool_Reserved_Size時說明保留區的大小不夠,你需要增加Shared_Pool_Reserved_Size的值
    (7).
    把重要的PL/SQL代碼保持在內存中
    你可以把常用的PROCEDURE銷定(Pinning)Shared_Pool_Reserved_Size
    做法如下:
              a)sys用戶登錄
              b)
    運行@%ORACLE_HOME%/rdbms\admin\dbmspool.sql
              c)SQL>execute DBMS_SHARED_POOL.KEEP('PROCEDURENAME') (
    銷定,必須用sys完成)
              d)
    找到銷定的對象select owner,name,type from v$db_object_cache where kept='YES';
              e)
    銷定對單獨的SQL語句無法操作,盡可能的把大語句做成PROCEDURE,可以用一下語句尋找出比較大的語句
    select substr(sql_text,1,45),length(sql_text) "STMT_SIZE" from v$sqlarea where command_type=47 order by length(sql_text) desc;
              f)
    可以編寫一個腳本,當實例啟動之后運行,把所有需要銷定的語句執行一下
              h)
    只有使用UNKEEP或者實例關閉時才會取消銷定
    (8).
    其他的一些調整Library Cache參數
    a)open_cursors :
    默認50
    b)cursor_space_for_time
    默認false
    c)session_cached_cursors
    默認0(無游標高速緩存)
    d)cursor_sharing
    默認EXACT --2SQL語句必須完全匹配才能共享shared pool中所緩存的已分析代碼.
                     SIMILAR --
    允許2條僅在字面上不同的SQL語句共享shared pool中所緩存的已分析代碼.
    例如:select cust_id from col_cust where cust_name = 'wang'
         select cust_id from col_cust where cust_name = 'huang'
    上述兩句在SIMILAR模式中是相等,可以使用緩存的已分析代碼.
    posted on 2011-02-23 10:33 cAng^Er 閱讀(256) 評論(0)  編輯  收藏 所屬分類: |:數 據 庫:|
    主站蜘蛛池模板: 亚洲国产精品成人久久蜜臀 | 成人永久福利免费观看| 亚洲午夜久久久久久尤物| 日本免费一区二区三区| 久久亚洲精品成人综合| 国产精品网站在线观看免费传媒 | 黄视频在线观看免费| 亚洲色无码专区在线观看| 中文字幕成人免费高清在线 | 亚洲第一区香蕉_国产a| 免费无码VA一区二区三区| 久久久久亚洲av无码专区喷水| 日韩不卡免费视频| 亚洲综合国产成人丁香五月激情 | 亚洲一区免费在线观看| 久久精品女人天堂AV免费观看| 亚洲人成色99999在线观看| 日本免费高清一本视频| 鲁啊鲁在线视频免费播放| 亚洲一区二区三区在线观看精品中文| 97人妻精品全国免费视频| 亚洲最新永久在线观看| 成人看的午夜免费毛片| 曰批免费视频播放免费| 亚洲AV午夜成人片| 女性自慰aⅴ片高清免费| 一级做a爰性色毛片免费| 亚洲国产二区三区久久| 成人免费视频小说| 精品国产污污免费网站入口| 91久久亚洲国产成人精品性色| 成人黄动漫画免费网站视频| 久青草视频97国内免费影视| 亚洲成人免费在线观看| 又粗又硬免费毛片| 99久久久国产精品免费牛牛四川 | 亚洲国产午夜福利在线播放| 一级毛片免费观看不卡的| 亚洲精品天堂成人片AV在线播放| 国产亚洲色视频在线| 成人免费在线看片|