查看: 2055|回复: 6

[讨论] 一个比较奇怪的SQL优化,占用1Gundo

[复制链接]
论坛徽章:
4
生肖徽章2007版:龙
日期:2009-03-14 13:37:322010新春纪念徽章
日期:2010-03-01 11:19:07懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
发表于 2009-11-19 22:25 | 显示全部楼层 |阅读模式
UPDATE TABLE1 SET(A,B) =( SELECT A,B TABLE2 WHERE ID=TABLE1.ID AND ID1=TABLE1.ID1)
其中,table1在id和id1上有索引,而table2由于数据量很小,因此没有索引,TABLE1大约700多万行数据。执行计划如下所示:
| Id  | Operation            |  Name                | Rows  | Bytes | Cost  | Ps
tart| Pstop |

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

|   0 | UPDATE STATEMENT     |                      |    88M|  7248M|   104K|

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
    |       |

|   1 |  UPDATE              | TABLE1        |       |       |       |
    |       |

|   2 |   PARTITION RANGE ALL|                      |       |       |       |
  1 |    13 |

|   3 |    TABLE ACCESS FULL | TABLE1        |    88M|  7248M|   104K|
  1 |    13 |


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  4 |   TABLE ACCESS FULL  | TABLE2  |     1 |   207 |    11 |
    |       |

--------------------------------------------------------------------------------
-------------
请问,为什么table1没有走索引呢?
论坛徽章:
4
生肖徽章2007版:龙
日期:2009-03-14 13:37:322010新春纪念徽章
日期:2010-03-01 11:19:07懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
 楼主| 发表于 2009-11-19 22:37 | 显示全部楼层
补充一下,TABLE1的索引是inserttime,id,id1的联合索引。

使用道具 举报

回复
论坛徽章:
9
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51蛋疼蛋
日期:2011-08-09 14:26:55ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19奥迪
日期:2013-09-12 15:57:042014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
发表于 2009-11-19 22:45 | 显示全部楼层
UPDATE TABLE1 SET(A,B) =( SELECT A,B TABLE2 WHERE ID=TABLE1.ID AND ID1=TABLE1.ID1)

你有啥索引? 强制呢?

update (elect a,A,a,B,b.A,b.B from table1 a , table2 b where b.id=a.id and a.id1=b.id1) set

a.A=b.A ,
a.B=b.B

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2009-11-19 22:46 | 显示全部楼层
undo的大小和被修改的记录记录数以及修改的字段是否索引有关

[ 本帖最后由 棉花糖ONE 于 2009-11-19 22:48 编辑 ]

使用道具 举报

回复
论坛徽章:
1
生肖徽章2007版:狗
日期:2009-10-08 19:42:37
发表于 2009-11-19 23:22 | 显示全部楼层
UPDATE TABLE1 SET(A,B) =( SELECT A,B TABLE2 WHERE ID=TABLE1.ID AND ID1=TABLE1.ID1)
你这样写是不是要更新table1表的所有记录

使用道具 举报

回复
论坛徽章:
2
会员2006贡献徽章
日期:2006-04-17 13:46:342011新春纪念徽章
日期:2011-02-18 11:42:48
发表于 2009-11-20 08:54 | 显示全部楼层
1、select * from table1 a where exists (select 0 from table2 b where a.id=b.id and a.id1=b.id1);

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2007-02-07 08:25:32ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2009-11-20 09:12 | 显示全部楼层
你这样写即使table2很小,table1的全部记录都会被更新的。
只不过关联不上的更新成空而已。加上where exists

使用道具 举报

回复

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

本版积分规则 发表回复

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号
  
快速回复 返回顶部 返回列表