降低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%左右