熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracle的共享連接和專用連接方式之初探

2022-06-13   來源: Oracle 
在專用連接方式中每一個連接到數據庫服務器的客戶端請求服務器會和客戶端之間建立起連接這個連接用於專門處理該客戶端的所有請求直到用戶主動斷開連接或網絡出現中斷在連接處於空閒時後台進程PMON會每隔一段時間就會測試用戶連接狀況如果連接已斷開PMON會清理現場釋放相關的資源 專用連接相當於一對一的連接能夠快速的響應用戶的請求當然在連接的時候首先要創建PGA(Program global area)參數pga_aggregate_target 決定可以由所有服務器進程使用的內存的總量參數 workarea_size_policy  決定是用手動管理還是自動管理

  SQL> show parameter pga_aggregate_target

  NAME                                 TYPE        VALUE

pga_aggregate_target                 big integer

  SQL> show parameter workarea_size_policy

  NAME                                 TYPE        VALUE

workarea_size_policy                 string      AUTO

  而Pga由三部分構成其中有可以配置的 sort_area_size還有會話信息堆棧空間

  sort_area_size是用戶用來排序的內存空間

  SQL> show parameter sort_area_size

  NAME                                 TYPE        VALUE

sort_area_size                       integer    

  如果排序的數據量比較大排序空間不夠用這時Oracle通過專用算法對數據進行分段分段後的數據轉移到臨時表空間中在臨時表空間中進行排序完成後再合在一起返回給請求的用戶這是大排序為什麼使用臨時表空間的原因

  在專用連接中連接所需要的資源全部在PGA中分配該內存區為指定連接私有其它進程不能訪問

  專用連接采用一對一的連接方式能很的響應用戶的請求但是如果連接用戶太多時由於要對每一個連接分配資源因此連接數受硬件限制比較大為了克服這種情況Oracle 提出了共享連接的連接方法即用一個服務器的進程響應多個用戶連接與專用連接不同有連接時才創建PGA不同共享連接在實例一啟動就分配指定數量的服務器進程所用戶的連接以排隊的方式由分配器指定給服務器進程其它的進程排隊等待只要用戶的請求一執行完就會馬上斷開連接分配器會把空閒的服務器進程分配給其它排除的進程

  采用共享連接可以有效的提高服務器資源的利用率但是對一個分配器只支持一種協議每個分配器有自已的排隊隊列在請求的任務完成後由分配器將操作結果返回給相應的用戶進程但是共享連接的建立 需要Oracle的監聽進程分配器共享服務器進程才能共同完成一個連接的創建所以連接的分配也需要一定的時間和資源

  在共享連接中sort_area_size 將在 SGA 的 Large_pool 中分配

  上面所說的是兩種連接的創建方法和管理方法在理想的情況下對於長事務或大事務使用專用連接可以有效的提高系統的性能減少用戶等待和事務的排隊提高系統的利用率對於超短事務和短事務小事務使用共享連接方式可以在資源與效率之間達到一種平稀比如對於OLTP 系統使用專用連接而對於網站等可以使用共享連接

  那麼能不能在OLTP系統中使用共享連接呢?如果能使用那麼能不能提高性能呢?

  OLTP系統一般而言有較多的長事務和大事務如用戶的某幾步操作必須作為一個事務對於這種情況我們分析一下看看會發生什麼樣的情況

  分析首先有一個前提那就是用戶請求數要大於共享服務器進程數否則減去分配器管理性能支出共享連接的性能要低於專用連接

  如果用戶請求數大於共享服務器進程數那麼肯定有請求是在排隊假定目前一個共享服務器進程正在執行一個長事務那麼請求隊列就要一直等直到當前的事務結束從用戶請求的角度看很明顯響應的時間加長了從服務器角度看我們先看一下由網友 WESTLIFE_XU 提供的實例

  共享連接和長事務是背道而馳的長事務的共享連接會造成shared 進程的嚴重排隊造成性能的嚴重下降

     給你看一個極端的例子以前的同事公司的

  代碼:
top
oracle         m m m R    : oracle
oracle         m m m S    : oracle
   oracle         m m m R    : oracle
oracle         m m m R      : oracle
oracle         m m m R      : oracle
oracle         m m m R     : oracle
oracle         m m m R      : oracle
oracle         m m m R   : oracle
oracle         m m m R      : oracle
oracle         m  m  m S       : oracle
oracle         m  m  m S     : oracle
oracle        S       : tnslsnr
oracle         m m m S      : oracle

vidb:~# ps ef|grep
oracle          Dec ?        :: ora_s_SERVICE
vidb:~# ps ef|grep  
oracle         Nov ?        :: ora_s_SERVICE

top的進程全部都是類似ora_s的共享服務器進程服務器負載在以上


  舉個例子個request共享比說個共享進程每個shared進程在一個時間內只能處理一個request也就是說個進程在同一時間內只能處理個request如果一個request需要很長的處理會造成其它請求的嚴重排隊

  shared進程要求客戶端的每個request要特別快如果客戶端的一個request就占了很長時間那別的request就得一直等著共享就沒有什麼意義了

  從上面可以看出如果在有大事務和長事務的OLTP系統中系統會比原來更慢!

  綜合來看共享連接和專用連接各有所長關鍵是看應用能適用於自已應用的連接方式就是好方式


From:http://tw.wingwit.com/Article/program/Oracle/201311/17945.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.