今天碰到了性能問題
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