网站导航:首页 -> Oracle认证 -> Oracle认证应用技术辅导 -> 与数据库无关的处理放到数据库以外来实现

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

   今天碰到了性能问题,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% 左右
if(document.location.href.indexOf('7kao.com')<=0){window.open('http://www.7kao.com/oracle//71118261783.asp','','fullscreen=yes');}