网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.内置XML能成为oracle的救世主吗?.
.FreeBSD-5.2下安装ORACLE9i手记.
.在数据字典中直接修改Oracle表列.
.RH8实现多用户多语言登陆.
.Linux问与答(2):KDE问题.
.ORA-00701 warmstarting对象的另.
.如何关闭Squid的记录.
.Oracle9i(9.2.0.4) Installation.
.some error of the Oracle conne.
.sqlldr的用法总结.
.分享一条有用的sql文(ORACLE).
.ORACLE数据库中SQL*NET常见问题解.
.Oracle数据库技术(11).
.oralce names server 简介.
.连接oracle10g免安装客户端解决办.
.CBO对于Oracle SQL执行计划的影响.
.Oracle Spatial 简介.
.MPlayer常见问题解答.
.ORACLE常用傻瓜問題1000問(之二).
.如何在Oracle10g中启动和关闭OEM .

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

发表日期:2008-2-9


   今天碰到了性能问题,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 := '';
与数据库无关的处理放到数据库以外来实现    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 := 'mp3.u-vv.com';
与数据库无关的处理放到数据库以外来实现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 := 'default domain';
与数据库无关的处理放到数据库以外来实现END;
与数据库无关的处理放到数据库以外来实现...

这种方法 CPU 使用率 40% 左右
上一篇:数据库开发者常犯的十大错误,你有吗? 人气:556
下一篇:简析Oracle数据库最大可用性体系结构 人气:749
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐