查看: 4238|回复: 13

[PL/SQL] 求助:update脚本优化

[复制链接]
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
发表于 2011-1-23 15:01 | 显示全部楼层 |阅读模式
UPDATE TP_M_EXTENSION_DUEBILL a
   SET a.duebillmaturedate = (SELECT b.duebillmaturedate
                                FROM TP_M_EXTENSION_DUEBILL2 b
                               WHERE a.dboperationid = b.dboperationid
                                 and a.extensionflag = 1)
where exists (select 1
          from TP_M_EXTENSION_DUEBILL2 b
         where a.dboperationid = b.dboperationid
           and a.extensionflag = 1)

用TP_M_EXTENSION_DUEBILL2对TP_M_EXTENSION_DUEBILL进行update操作,2张表都是定期清空,因此都没有索引,TP_M_EXTENSION_DUEBILL大约8000W,TP_M_EXTENSION_DUEBILL2大约200W,请问该如何优化,谢谢。
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
 楼主| 发表于 2011-1-23 15:08 | 显示全部楼层
是否需要对2表增加索引?

使用道具 举报

回复
论坛徽章:
16
授权会员
日期:2005-11-01 10:49:02ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472011新春纪念徽章
日期:2011-02-18 11:43:322010年世界杯参赛球队:南非
日期:2010-05-12 11:08:572010新春纪念徽章
日期:2010-03-01 11:04:542009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:狗
日期:2008-10-31 12:50:13生肖徽章2007版:狗
日期:2008-10-24 18:01:04奥运会纪念徽章:排球
日期:2008-10-24 13:30:01生肖徽章2007版:狗
日期:2008-10-20 14:41:16
发表于 2011-1-23 15:45 | 显示全部楼层
b.dboperationid建索引试试
a.extensionflag = 1 不放在最外层?

使用道具 举报

回复
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
 楼主| 发表于 2011-1-23 15:53 | 显示全部楼层
你的意思是说改成这样吗?
UPDATE TP_M_EXTENSION_DUEBILL a
   SET a.duebillmaturedate = (SELECT b.duebillmaturedate
                                FROM TP_M_EXTENSION_DUEBILL2 b
                               WHERE a.extensionflag = 1
and a.dboperationid = b.dboperationid)
where exists (select 1
          from TP_M_EXTENSION_DUEBILL2 b
         where a.extensionflag = 1
and a.dboperationid = b.dboperationid)

使用道具 举报

回复
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
 楼主| 发表于 2011-1-23 18:02 | 显示全部楼层
我现在修改了处理方式,不用update,采用insert:
insert /*+ APPEND NOLOGGING PARALLEL */
into TP_M_EXTENSION_DUEBILL
  (DBOPERATIONID, EXTENSIONFLAG, DUEBILLMATUREDATE)
  select a.dboperationid,
         a.extensionflag,
         CASE
           WHEN a.dboperationid = b.dboperationid and a.extensionflag = '1' THEN
            b.duebillmaturedate
           ELSE
            a.duebillmaturedate
         END
    from tb_duebillinfo a
    left join TP_M_EXTENSION_DUEBILL2 b
    on a.dboperationid = b.dboperationid ;
原来4小时出不来,现在只需要10分钟

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2011-1-23 19:21 | 显示全部楼层
merge或update (select ........) where ...试试

使用道具 举报

回复
论坛徽章:
51
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22铁扇公主
日期:2012-02-21 15:03:13最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-05-22 15:10:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:13:332013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-12 09:34:36itpub13周年纪念徽章
日期:2014-09-28 10:55:55
发表于 2011-1-23 20:29 | 显示全部楼层

回复 #1 ahwjcdz 的帖子

UPDATE TP_M_EXTENSION_DUEBILL a
   SET a.duebillmaturedate = (SELECT b.duebillmaturedate
                                FROM TP_M_EXTENSION_DUEBILL2 b
                               WHERE a.dboperationid = b.dboperationid
                                 and a.extensionflag = 1)
这样写完不加where 子句结果应该没影响吧?
加上索引应该挺快的

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2011-1-23 21:17 | 显示全部楼层
原帖由 iori809 于 2011-1-23 20:29 发表
UPDATE TP_M_EXTENSION_DUEBILL a
   SET a.duebillmaturedate = (SELECT b.duebillmaturedate
                                FROM TP_M_EXTENSION_DUEBILL2 b
                               WHERE a.dboperationid = b.dboperationid
                                 and a.extensionflag = 1)
这样写完不加where 子句结果应该没影响吧?
加上索引应该挺快的

这个和LZ的SQL就不等价了
update .... where.....
这个where在子查询里面和在外面,那完全不同,没有外面的where是全表更新,匹配不上的话,duebillmaturedate 这个有值也会被更新为NULL,问题很严重

使用道具 举报

回复
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
 楼主| 发表于 2011-1-23 22:54 | 显示全部楼层
多谢了,不过我现在觉得还是用insert处理比较稳妥,而且效率不错

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2011-1-23 23:23 | 显示全部楼层
原帖由 iori809 于 2011-1-23 20:29 发表
UPDATE TP_M_EXTENSION_DUEBILL a
   SET a.duebillmaturedate = (SELECT b.duebillmaturedate
                                FROM TP_M_EXTENSION_DUEBILL2 b
                               WHERE a.dboperationid = b.dboperationid
                                 and a.extensionflag = 1)
这样写完不加where 子句结果应该没影响吧?
加上索引应该挺快的


没有外围的WHERE 语句, 就是修改该表的所有记录, 这样, 对于那些不符合记录的数据, 将被清空. 而原来语句,却是修改符合条件的记录.

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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