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