首页 »数据库 » 数据库性能优化:提高数据库性能 让无关处理放到外层实现 »正文
数据库性能优化:提高数据库性能 让无关处理放到外层实现
来源: 发布时间:星期六, 2008年12月20日 浏览:2次 评论:0
="t18">
问题: DB Server ![](/icons/25700de.gif) CPU 100% ![](/icons/25700dou.gif) vmstat ![](/icons/25700de.gif) 输出也很高 ![](/icons/25700dou2.gif) 找到CPU高 ![](/icons/25700de.gif) SQL语句是使用了 ![](/icons/25700yi.gif) 个将IP地址 ![](/icons/25700zifu.gif) 串转换为数字 ![](/icons/25700de.gif) PL/SQL 自定义 ![](/icons/25700hanshu.gif) ![](/icons/25700dou.gif) 后来将这个逻辑放到数据库外 ![](/icons/25700de.gif) VB ![](/icons/25700chengxu.gif) 实现 ![](/icons/25700dou.gif) CPU使用率下降 ![](/icons/25700dou.gif) 问题解决 ![](/icons/25700dou2.gif) 其实那个 ![](/icons/25700hanshu.gif) 处理并不复杂 ![](/icons/25700dou.gif) 也没有访问数据库对象 ![](/icons/25700dou.gif) 没想到有如此大 ![](/icons/25700de.gif) 影响 ![](/icons/25700dou2.gif) 得出 ![](/icons/25700de.gif) 结论就是:和数据库无关 ![](/icons/25700de.gif) 处理过程放到数据库以外 ![](/icons/25700de.gif) ![](/icons/25700diaoyong.gif) ![](/icons/25700chengxu.gif) 来实现 ![](/icons/25700dou.gif) 即便用SQL ![](/icons/25700chengxu.gif) 可以实现也应如此 ![](/icons/25700dou2.gif) 还有 ![](/icons/25700yi.gif) 个要注重 ![](/icons/25700de.gif) 问题 ![](/icons/25700dou.gif) 即不要在查询语句中 ![](/icons/25700diaoyong.gif) 自定义 ![](/icons/25700de.gif) PL/SQL ![](/icons/25700hanshu.gif) ![](/icons/25700dou.gif) 举个例子: 自定义 ![](/icons/25700hanshu.gif) 如下 ![](/icons/25700dou.gif) 输入16位整数IP地址 ![](/icons/25700dou.gif) 输出IP所属省份 ![](/icons/25700dou.gif) ipdb 中有8万条数据 ![](/icons/25700dou2.gif) 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 := ''; END; RETURN v_ret; EXCEPTION WHEN OTHERS THEN RAISE; END fn_ipaddr_to_province; / 根据省份确定服务器地址 ![](/icons/25700dou.gif) do ![](/icons/25700main.gif) name 中有35条数据 ![](/icons/25700dou2.gif) 解决思路方法 思路方法 ![](/icons/25700yi.gif) : BEGIN SELECT serverip INTO v_serverip FROM do name WHERE province = fn_ipaddr_to_province (p_ip) AND ROWNUM = 1; EXCEPTION WHEN NO_DATA_FOUND THEN v_serverip := 'mp3.u-vv.com'; END; ... 这种思路方法 CPU 使用率 90% 以上 思路方法 2: v_province := fn_ipaddr_to_province (p_ip); BEGIN SELECT serverip INTO v_serverip FROM do name WHERE province = v_province AND ROWNUM = 1; EXCEPTION WHEN NO_DATA_FOUND THEN v_serverip := 'default do '; END; 这种思路方法 CPU 使用率 40% 左右
相关文章
读者评论
发表评论
|
|