今天碰到了性能问题
DB Server 的 CPU
%
vmstat 的输出也很高
找到 CPU 高的 sql 语句是使用了一个将 IP 地址字符串转换为数字的 PL/SQL 自定义函数
后来将这个逻辑放到数据库外的 VB 程序实现
CPU 使用率下降
问题解决
其实那个函数处理并不复杂也没有访问数据库对象没想到有如此大的影响得出的结论就是与数据库无关的处理过程放到数据库以外的调用程序来实现即便用 sql 程序可以实现也应如此
还有一个要注意的问题即不要在查询语句中调用自定义的 PL/SQL 函数举个例子
自定义函数如下输入位整数 IP 地址输出 IP 所属省份ipdb 中有万条数据
CREATEORREPLACEFUNCTIONfn_ipaddr_to_province(p_ipaddrNUMBER)
RETURNVARCHAR
IS
v_retVARCHAR():=;
BEGIN
BEGIN
SELECTprovince
INTOv_ret
FROMipdb
WHEREstart_ip<=p_ipaddrANDend_ip>=p_ipaddrANDROWNUM=;
EXCEPTION
WHENNO_DATA_FOUND
THEN
v_ret:=;
END;
RETURNv_ret;
EXCEPTION
WHENOTHERS
THEN
RAISE;
ENDfn_ipaddr_to_province;
/
根据省份确定服务器地址domainname 中有条数据
方法一
BEGIN
SELECTserverip
INTOv_serverip
FROMdomainname
WHEREprovince=fn_ipaddr_to_province(p_ip)ANDROWNUM=;
EXCEPTION
WHENNO_DATA_FOUND
THEN
v_serverip:=;
END;
这种方法 CPU 使用率 % 以上
方法二
v_province:=fn_ipaddr_to_province(p_ip);
BEGIN
SELECTserverip
INTOv_serverip
FROMdomainname
WHEREprovince=v_provinceANDROWNUM=;
EXCEPTION
WHENNO_DATA_FOUND
THEN
v_serverip:=defaultdomain;
END;
这种方法 CPU 使用率 % 左右