荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: Peter (小飞侠), 信区: Program
标 题: 提高ORACLE DEVELOPER/2000程序运行速度
发信站: BBS 荔园晨风站 (Thu Jan 21 22:40:34 1999), 转信
问题描述
作为Oracle数据库的一个开发工具,Developer/2000提供了较强
大的开发功能。但是,在对大型数据库进行检索处理等操作时,用Derv
loper/2000直接编写的PL/SQL过程运行效率较低。例如,在以下的应
用中,有一个名为test的基表,表中存储200万行记录。基表的列定义
为
description char (40)
detail char (12)
另一个基表temp的列定义为:
description char(40)
detail char(12)
flag number(2)
应用要求程序从基表中检索detail列值与给定初始变量对应值相
同的记录,并将符合条件的记录插入基表temp中。
最初的应用实现方法为,在Developer/2000的Forms内设计一个按
钮,并编写如下按钮触发器:
Declare /*定义变量*/
cursor my_cur is select * from test;/*定义游标*/
pointer my_cur%rowtype; /*循环‘指针’*/
loop counter number(2);/*循环变量*/
hit_counter number(2);/*计数器*/
result char (12)=`012301230123';/*程序开始*/
Begin
for pointer in my_cur loop
hit_counter:=0;
for loop_counter in l..12 loop
if substr(result,i,l)=substr(pointer.detail,i,l)then
hit_counter:=hit_counter+1;
end if;
end loop;
if hit_counter>4 then /*有4个以上字符与给定变量吻合的记
录*/
insert into temp values(pointer.description,pointer.deta
il,hit_counter):
end if;
end loop;
commit_form;
End
执行该Forms所需的时间约为5小时。
一、利用Oracle的内部过程提高运行效率
将上述在Oracle Forms中编写的PL/SQL程序改写为一个Oracle内
部过程,然后从Oracl Forms中调用该过程,运行时间只需约18分钟。
首先在数据库服务器上创建该过程:
create procedure search as
cursor my_cur is select*from test;
pointer my_cur%rowtype;
loop_counter number(2);
hit_coumter number(2);
reeslt char(12):=`012301230123';
Begin
for pointer in my_cur loop
hit_counter:=0;
for loop_counter in 1..12 loop
if substr(result,i,l)=substr(pointer.dtail,i,l)then
hit_counter:-hit)counter+1;
end if;
end loop;
if hit_counter>4 then
hit_counter:13-hit_counter;
insert into temp
valuse(pointer.description,pointer.detail,hit_counter);
end if;
end loop;
commit;
End;
然后将Forms中的原触发器改写如下:
Begin
search;
End;
再运行该F orms,约18分钟应用执行完毕,运行速度提高了15倍
。
二、利用C语言提高运行效率
在应用数据进入数据库之前可以利用C语言对应用文件进行处理
。处理结束后,利用Orc le工具SQL * Loader或Proc*C将文件中的数
据装入数据库基表。例如:假设上述test基表中的数据对应的文件为C
:\test.txt,temp基表对应的文件为C:\temp.txt。则可用C程序检索e
sttxt文件,并将满足条件的记写入temp.txt文件中。C程序可编写如
下:
void main(void)
{char buf[200];
char*description,*detail;
statec char rdsult]={"012301230123"};
int loop)counter,hit)counter;
FILE *reading,*writing;
if ((reading=fopen("c:\test.txt","r"))==null)
{printf("c:\test.txt open error.\");
getch();
return;
}if((writing=fopen("c:\temp.txt","r"))==null)
{printf("c:\temp.txt opern error.\n")
getch();
return;
}
do
{hit_counter=0;
fgets(but,sizeof(buf),reading);
if(strlen*buf)!=53
bread;
description=buf;
detail=description+41;
description[30]=`\0'
deetail[12]=`0';
for(loop)counter=0;loop_counter<12;loop)counter++)
{if(detail[i]==fesult[i])
hit_counter++;
}
if(hit_counter>4
fprintf(writing,"%-30s\t\%s\n",description,detail):
}
while(feof(reading)==0);
fclose(writting);
fclose(reading);
return;
}
用C程序检索包含200万条记录的test.txt文件只需不到1分钟。
在Oracle Forms中可利用其OLE功能6调用上述程序。处理结束后,可
利用Oracle SQL*Loader或Pro*C工具将text.x t和temp.txt文件中的
数据装入数据库对应的基表中。
编者注:第二种方法似乎不如第一种,请熟悉Oracle Developer/2
000应用开发的读者对此发表意见,并给出更好的方法。
--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店