查看: 9493|回复: 25

【讨论】这种情况,如何优化?

[复制链接]
论坛徽章:
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
发表于 2014-5-23 10:54 | 显示全部楼层 |阅读模式
过程中有这样一段代码:

update tab_1 t1 set (tab_1_c2 tab_1_c3)
(select t2.c2, t3.c2 from tab_2 t2, tab_3 t3 where t1.id=t2.id and t2.id2 = t3.id2(+))
where t1.id in (select id from tab_2 t2 where status = '2'  and updatetime >= v_date);

由于过程经常被调用,因此,实际上上述的代码,很可能是作无用功,也就是,实际上两边的数据一样,并不需要修改,
但我们由于不知道tab_1的这段数据是否有过变化,为确保一致,即便很能作无用功,也没办法。

问:如何优化这个问题?

论坛徽章:
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
发表于 2014-5-23 13:56 | 显示全部楼层
1. 这个逻辑应该是修改TB_1的数据吧?那么它本身是否修改不重要吧?还是我理解错了?
应该是另外的表的记录是否被改过吧?

使用道具 举报

回复
论坛徽章:
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
 楼主| 发表于 2014-5-23 14:38 | 显示全部楼层
iori809 发表于 2014-5-23 13:56
1. 这个逻辑应该是修改TB_1的数据吧?那么它本身是否修改不重要吧?还是我理解错了?
应该是另外的表的记录 ...

是要修改TAB_1表的数据,但由于频繁地被修改,很可能,修改前后的值都是一样的,也就是说,这样的修改操作实际上是作无用功,我希望,当匹配的两行记录不同时,再去作修改,当然,若能做到两字段值不同时,再修改,那是最好的。

使用道具 举报

回复
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-30 16:11:222012新春纪念徽章
日期:2012-01-04 11:57:562015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
发表于 2014-5-23 22:25 | 显示全部楼层
tab_1中的列  tab_1_c2 ,tab_1_c3 有别的语句 修改吗?

如果没有的话, 是不是可以 在tab_2,tab_3中的相关记录修改的时候 ,去触发更新tab_1,而不用这样更新

使用道具 举报

回复
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-30 16:11:222012新春纪念徽章
日期:2012-01-04 11:57:562015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
发表于 2014-5-23 22:27 | 显示全部楼层
如果 单从语句上来说:
UPDATE tab_1 t1
SET
  (
    tab_1_c2 tab_1_c3
  )
  (SELECT t2.c2,
    t3.c2
  FROM tab_2 t2,
    tab_3 t3
  WHERE t1.id=t2.id
  AND t2.id2 = t3.id2(+)
  )
WHERE exists
  (SELECT 1 FROM tab_2 t2 WHERE status = '2' AND updatetime >= v_date and t1.id=t2.id
  );

这样 会不会好点?

使用道具 举报

回复
论坛徽章:
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
 楼主| 发表于 2014-5-23 22:43 | 显示全部楼层
psufnxk2000 发表于 2014-5-23 22:27
如果 单从语句上来说:
UPDATE tab_1 t1
SET

我没试过,猜测,到了10G以后,CBO已经很聪明,EXITS 和 IN 基本无差别了,

使用道具 举报

回复
认证徽章
论坛徽章:
67
现任管理团队成员
日期:2012-06-02 02:10:00ITPUB元老
日期:2012-09-12 14:06:14ITPUB社区千里马徽章
日期:2013-06-09 10:15:34季节之章:冬
日期:2012-09-04 11:05:30季节之章:春
日期:2012-09-05 09:20:36优秀写手
日期:2013-12-18 09:29:09马上有房
日期:2014-04-10 13:35:362014年新春福章
日期:2014-04-14 09:54:08马上有车
日期:2014-02-28 16:43:13马上加薪
日期:2014-02-19 11:55:14
发表于 2014-5-24 14:21 | 显示全部楼层
福哥,这个为什么要考虑优化,执行代价很高吗?

使用道具 举报

回复
论坛徽章:
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
 楼主| 发表于 2014-5-24 14:25 | 显示全部楼层
kelsoncong 发表于 2014-5-24 14:21
福哥,这个为什么要考虑优化,执行代价很高吗?

不是,而是不想作无用功,因为修改前后的值都是一样的,

使用道具 举报

回复
认证徽章
论坛徽章:
67
现任管理团队成员
日期:2012-06-02 02:10:00ITPUB元老
日期:2012-09-12 14:06:14ITPUB社区千里马徽章
日期:2013-06-09 10:15:34季节之章:冬
日期:2012-09-04 11:05:30季节之章:春
日期:2012-09-05 09:20:36优秀写手
日期:2013-12-18 09:29:09马上有房
日期:2014-04-10 13:35:362014年新春福章
日期:2014-04-14 09:54:08马上有车
日期:2014-02-28 16:43:13马上加薪
日期:2014-02-19 11:55:14
发表于 2014-5-24 14:27 | 显示全部楼层
ZALBB 发表于 2014-5-24 14:25
不是,而是不想作无用功,因为修改前后的值都是一样的,

这个是有数据同步作用的,要是开销不很大,放着好了.
你这个属于强迫症状...

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
发表于 2014-5-24 18:23 | 显示全部楼层
本帖最后由 bfc99 于 2014-5-24 18:23 编辑

想到的方法是在更新前做判断,比如
如果
SELECT COUNT(1) FROM
(SELECT tab_1_c2,tab_1_c3 FROM tab_1
MINUS
SELECT t2.c2,t3.c2 from tab_1 t1,tab_2 t2, tab_3 t3
where t1.id=t2.id and t2.id2 = t3.id2(+)
    and  t2.status = '2'  and t2.updatetime >= v_date
) a
WHERE ROWNUM=1;
的结果大于0才执行更新语句。

但需要评估这个判断语句的执行性能。

使用道具 举报

回复

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

本版积分规则 发表回复

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