荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店