与数据库无关的处理放到数据库以外来实现呢
文章来源:延庆文学网 | 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% 左右 查看本文来源
昆明妇科习惯性流产治疗费用多少钱思密达和必奇哪种更适合宝宝
许昌哪家白癜风医院好
上一篇:与客户打交道应避免哪些行为牛
上一篇:与数据输入和计算有关的快捷键的