一次通過DB_LINK抽取資料過慢原因分析

gaopengtttt發表於2012-03-22

問題1

   核心資料庫使用的共享伺服器模式,導致異常等待事件

virtual circuit status

非常巨大。

   ORACLE 官方描述如下:

    "virtual circuit wait"    - for when the shared server is

                              blocked waiting on a specific

                              circuit / message

   檢查核心資料庫確實使用了共享模式,修改提取資料的DB_LINK,使用獨佔的模式連線來避免這個問題

 

問題2

   分析發現儲存過程都呼叫了函式Get_Rate,而Get_Rate大量迴圈的呼叫語句,我測試的時候呼叫測試未300W次,並且Get_Rate函式使用遊標取出資料進行迴圈,而引用的T_CHG_RATE來自遠端,這樣大量迴圈呼叫在加上遠端網路延遲,等待時間也就加長。

   和智軟商量後決定建立Get_Rate到本地,並且加入判斷如果為人民幣就不呼叫此函式。此遊標經過調整資料返回速度大大減少,幾個小時的返回時間減少到5分鐘左右。

 

問題 3

   分析發現,很多儲存過程,遊標每返回一行資料就會做一條判斷,而判斷的表確是放通過DB_LINK進行呼叫,如果遊標返回很大量的行,那網路的延遲就會越發的明顯。

   建議建立判斷表在本地加快速度,同時考慮更好的遊標資料抽取方式,不實用迴圈,待改進。

create or replace procedure Bulk_Test2(p_array_size in number)
as
 l_tablename dbms_sql
Varchar2_Table;
 cursor c is select table_name from user_tables;
begin
     open c;
     loop
         fetch c bulk collect into l_tablename limit p_array_size;
         
         forall i in 1..l_tablename count
                insert into t3 values (l_tablename(i));
         exit when c%notfound;
     end loop;
end;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-719224/,如需轉載,請註明出處,否則將追究法律責任。

相關文章