查看: 2034|回复: 12

存储过程优化问题

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2012-11-8 18:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,存储过程如下:
create or replace procedure proc_backup(
tablename in  varchar2,
workdt in varchar2,
keyvalue in varchar2,
tablenamehis in varchar2,
resul out number,
increment out number
) is
increm number;
w_sql varchar2(32000) :=
    'declare
    print varchar2(50);
    counter int ;
    increm number  ;
    w_rec '||tablename||'%rowtype;
    my_rowid UROWID;
    CURSOR c_tbl IS Select * from '||tablename|| '  Where '||WORKDt||' < '''||keyvalue||''' for updat
  /*以下都会删除,插入操作*/
...............................................
execute immediate w_sql using out increm ;
.............................................
有百万条数据,这样运行的速度很慢,请高手多多指教,愚人感觉,动态sql是可以优化,还请多多赐教
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
2#
发表于 2012-11-8 23:14 | 只看该作者
本帖最后由 Yong Huang 于 2012-11-8 09:14 编辑

Event? Version? Plan?

使用道具 举报

回复
论坛徽章:
0
3#
 楼主| 发表于 2012-11-9 10:18 | 只看该作者
oracle 10g

使用道具 举报

回复
论坛徽章:
0
4#
 楼主| 发表于 2012-11-9 11:16 | 只看该作者
LOOP
       counter :=0;
       Open c_tbl;
       FOR counter IN 0..8000 LOOP
            begin                  
                   fetch c_tbl into w_rec;
                   if c_tbl%NOTFOUND then
                   raise NO_DATA_FOUND;
                   end if;
                   Insert into '||tablenamehis||'  values w_rec;
                   increm := increm+1;
                   Delete from '||tablename||' where current of c_tbl;
                   exception
                          when DUP_VAL_ON_INDEX then         
                          NULL;
                        
                          when others then
                          raise;
            end;         
       END LOOP;
       CLOSE c_tbl;
       commit;
    END LOOP;


循环会消耗plsql与sql的切换时间,大家看看,怎样少用循环,或者不要,,,,

使用道具 举报

回复
论坛徽章:
0
5#
 楼主| 发表于 2012-11-9 17:18 | 只看该作者
自己结吧,采用每次取N条,然后 块插入,块删除,这些操作放在一个动态sql,然后循环执行这个语句,速度可以明显提高

使用道具 举报

回复
论坛徽章:
0
6#
发表于 2012-11-12 14:36 | 只看该作者
对于大批量数据订正,都是采用分批提交来提高性能。
在已经使用INDEX进行更新或者删除的时候,瓶颈一般在REDO上面,通过批量把小事务拼装为大事务减少对REDO的压力。
10GR2还可以通过修改COMMIT_WRITE参数进一步进行优化

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
7#
发表于 2012-11-12 15:04 | 只看该作者
能用一条SQL搞定的事情,最好不要自己写循环处理,自己写循环有点类似于强制nest loop,而且增加了很多运行时切换

若是为了减少对UNDO的影响,倒是可以进行拆分,不过,也可以采用bulk\for all方式进行批量处理,只是要控制好PGA的消耗

使用道具 举报

回复
论坛徽章:
0
8#
 楼主| 发表于 2012-11-12 15:57 | 只看该作者
楼上有道理,一开始的时候,自己写的循环,返现效率很低,换成bulk方式,效率多倍的提高。

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
9#
发表于 2012-11-13 01:13 | 只看该作者
> 通过批量把小事务拼装为大事务减少对REDO的压力

You mean reducing pressure on UNDO?

使用道具 举报

回复
论坛徽章:
0
10#
 楼主| 发表于 2012-11-14 14:35 | 只看该作者
还请高手解释 reducing pressure on UNDO

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表