数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

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


发布日期:2021年07月16日
 
与数据库无关的处理放到数据库以外来实现
今天碰到了性能问题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 使用率 % 左右

上一篇:Oracle作业(JOB)更新next

下一篇:数据库完整性设计