与数据库无关的处理放到数据库以外来实现
今天碰到了性能问题,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');}