与数据库无关的处理放到数据库以外来实现呢

文章来源:延庆文学网  |  2021-10-29

今天碰到了性能问题,DB Server 的 CPU 100%,vmstat 的输出也很高。找到 CPU 高的 sql 语句是使用了一个将 IP 地址字符串转换为数字的 PL/SQL 自定义函数,后来将这个逻辑放到数据库外的 VB 程序实现,CPU 使用率下降,问题解决。

其实那个函数处理并不复杂,也没有访问数据库对象,没想到有如此大的影响。得出的结论就是:与数据库无关的处理过程放到数据库以外的调用程序来实现,即便用 sql 程序可以实现也应如此。

还有一个要注意的问题,即不要在查询语句中调用自定义的 PL/SQL 函数,举个例子:

自定义函数如下,输入16位整数 IP 地址,输出 IP 所属省份,ipdb 中有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:=\'\';

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% 左右 查看本文来源

昆明妇科习惯性流产治疗费用多少钱
思密达和必奇哪种更适合宝宝
许昌哪家白癜风医院好
友情链接