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

與數據庫無關的處理放到數據庫以外來實現

2013-11-13 16:17:35  來源: Oracle 
今天碰到了性能問題DB Server 的 CPU %vmstat 的輸出也很高找到 CPU 高的 sql 語句是使用了一個將 IP 地址字符串轉換為數字的 PL/SQL 自定義函數後來將這個邏輯放到數據庫外的 VB 程序實現CPU 使用率下降問題解決

    其實那個函數處理並不復雜也沒有訪問數據庫對象沒想到有如此大的影響得出的結論就是與數據庫無關的處理過程放到數據庫以外的調用程序來實現即便用 sql 程序可以實現也應如此

    還有一個要注意的問題即不要在查詢語句中調用自定義的 PL/SQL 函數舉個例子

自定義函數如下輸入位整數 IP 地址輸出 IP 所屬省份ipdb 中有萬條數據

CREATE OR REPLACE FUNCTION fn_ipaddr_to_province (p_ipaddr NUMBER)
    RETURN VARCHAR
IS
    v_ret VARCHAR () := ;
BEGIN
    BEGIN
        SELECT province
            INTO v_ret
            FROM ipdb
        WHERE start_ip <= p_ipaddr AND end_ip >= p_ipaddr AND ROWNUM = ;
    EXCEPTION
        WHEN NO_DATA_FOUND
        THEN
            v_ret := ;
    END;

    RETURN v_ret;
EXCEPTION
    WHEN OTHERS
    THEN
        RAISE;
END fn_ipaddr_to_province;
/

根據省份確定服務器地址domainname 中有條數據

方法一


BEGIN
    SELECT serverip
        INTO v_serverip
        FROM domainname
    WHERE province = fn_ipaddr_to_province (p_ip) AND ROWNUM = ;
EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        v_serverip := ;
END;


這種方法 CPU 使用率 % 以上


方法二


v_province := fn_ipaddr_to_province (p_ip);

BEGIN
    SELECT serverip
        INTO v_serverip
        FROM domainname
    WHERE province = v_province AND ROWNUM = ;
EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        v_serverip := default domain;
END;


這種方法 CPU 使用率 % 左右
From:http://tw.wingwit.com/Article/program/Oracle/201311/18095.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.