职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1051|回复: 3

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

[复制链接]
cayean 发表于 2007-6-26 16:46 | 显示全部楼层 |阅读模式
来源:wzy0623的专栏


  今天碰到了性能问题,DB Server 的 CPU 100%,vmstat 的输出也很高。找到 CPU 高的 sql 语句是使用了一个将 IP 地址字符串转换为数字的 PL/SQL 自定义函数,后来将这个逻辑放到数据库外的 VB 程序实现,CPU 使用率下降,问题解决。
  
  其实那个函数处理并不复杂,也没有访问数据库对象,没想到有如此大的影响。得出的结论就是:与数据库无关的处理过程放到数据库以外的调用程序来实现,即便用 sql 程序可以实现也应如此。

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

自定义函数如下,输入16位整数 IP 地址,输出 IP 所属省份,ipdb 中有8万条数据。 CREATE OR REPLACE FUNCTION fn_ipaddr_to_province (p_ipaddr NUMBER)
  RETURN VARCHAR2
IS
  v_ret VARCHAR2 (100) := '';
BEGIN
  BEGIN
    SELECT province
      INTO v_ret
      FROM ipdb
    WHERE start_ip <= p_ipaddr AND end_ip >= p_ipaddr AND ROWNUM = 1;
  EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
      v_ret := &#39;&#39;;
  END;

  RETURN v_ret;
EXCEPTION
  WHEN OTHERS
  THEN
    RAISE;
END fn_ipaddr_to_province;
/

根据省份确定服务器地址,domainname 中有35条数据。

方法一: ...
BEGIN
  SELECT serverip
    INTO v_serverip
    FROM domainname
  WHERE province = fn_ipaddr_to_province (p_ip) AND ROWNUM = 1;
EXCEPTION
  WHEN NO_DATA_FOUND
  THEN
    v_serverip := &#39;mp3.u-vv.com&#39;;
END;
...

这种方法 CPU 使用率 90% 以上

方法二: ...
v_province := fn_ipaddr_to_province (p_ip);

BEGIN
  SELECT serverip
    INTO v_serverip
    FROM domainname
  WHERE province = v_province AND ROWNUM = 1;
EXCEPTION
  WHEN NO_DATA_FOUND
  THEN
    v_serverip := &#39;default domain&#39;;
END;
...

这种方法 CPU 使用率 40% 左右.
愚人 发表于 2007-7-8 14:41 | 显示全部楼层
谢谢楼主,好久没看到这么好的贴了
木已 发表于 2007-7-11 17:39 | 显示全部楼层
天公有大 美而无言
难忘樱花 发表于 2007-7-15 11:05 | 显示全部楼层
.  .  .  .
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-14 10:41 , Processed in 0.141942 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表