查看: 4415|回复: 18

超级update请教优化方法!!!

[复制链接]
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2010-12-14 17:41 | 显示全部楼层 |阅读模式
UPDATE  OFR_CHILD_ASSET_N_HIST A
     SET A.END_DT = '20101210'
   WHERE A.ASSET_ROW_ID IN
         (SELECT TRIM(ASSET_ROW_ID) FROM OFR_CHILD_ASSET_N_HIST_PATCH)
     AND A.END_DT = '30001231'


                                                                       基数                   i/ocost
UPDATE STATEMENT, GOAL = ALL_ROWS                       1                    30181                        427363950
UPDATE                                                                                         OFR_CHILD_ASSET_N_HIST       
  HASH JOIN RIGHT SEMI                                    1                    30181                        427363950
   TABLE ACCESS FULL                                   124782                     546                        OFR_CHILD_ASSET_N_HIST_PATCH        48579914
   PARTITION RANGE ALL                                 229115                29127                        301363333
    TABLE ACCESS BY LOCAL INDEX ROWID                   229115                29127                  OFR_CHILD_ASSET_N_HIST        301363333
     INDEX RANGE SCAN                            229115                              5749                          IND_END_DT        86764159


历时1个半小时。

OFR_CHILD_ASSET_N_HIST按照start_dt分区
end_dt建分区索引
其他字段均无索引
OFR_CHILD_ASSET_N_HIST表物理大小56G
OFR_CHILD_ASSET_N_HIST_PATCH有155433条记录
OFR_CHILD_ASSET_N_HIST_PATCH的ASSET_ROW_ID上有索引


select count(*) from OFR_CHILD_ASSET_N_HIST A
      where A.END_DT = '30001231'

有40309375条记录。
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2010-12-14 18:04 | 显示全部楼层
这2个表的关系是如何的? 你subquery中为什么要TRIM(ASSET_ROW_ID) 呢? 虽然OFR_CHILD_ASSET_N_HIST_PATCH的ASSET_ROW_ID上有索引, 但你用了trim就无法使用index了!

使用道具 举报

回复
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2010-12-14 18:24 | 显示全部楼层
不!现在问题不是subquery中TRIM(ASSET_ROW_ID)上没走索引,我之前在TRIM(ASSET_ROW_ID)创建过函数索引,问题是
OFR_CHILD_ASSET_N_HIST此表太大即使分区了,仍然超级慢的,OFR_CHILD_ASSET_N_HIST此表很大是按照start_dt分区的,而update中是访问的end_dt字段,所以在end_dt上创建了分区索引。

问题就是大表按start_dt分区的,而update中是访问的end_dt字段,所以在end_dt上创建了分区索引,虽然分区内走了索引但是仍然很慢很慢!

请教一下!
是否可以拆成delete和insert操作?
如何拆?

使用道具 举报

回复
论坛徽章:
13
2010广州亚运会纪念徽章:轮滑
日期:2010-09-03 12:44:53马上有房
日期:2014-04-04 13:51:34马上加薪
日期:2014-04-04 13:35:40优秀写手
日期:2014-03-14 06:00:13夏利
日期:2013-08-05 18:32:18复活蛋
日期:2013-06-25 17:22:592013年新春福章
日期:2013-02-25 14:51:24蛋疼蛋
日期:2013-01-08 18:08:502011新春纪念徽章
日期:2011-02-18 11:43:33生肖徽章2007版:兔
日期:2011-01-20 12:58:49
发表于 2010-12-14 20:25 | 显示全部楼层
关注

使用道具 举报

回复
论坛徽章:
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
发表于 2010-12-14 20:51 | 显示全部楼层

回复 #2 bell6248 的帖子

你这个最后update的记录数是多少?

使用道具 举报

回复
论坛徽章:
18
紫蛋头
日期:2011-07-25 08:06:53咸鸭蛋
日期:2011-12-27 11:35:38鲜花蛋
日期:2012-01-11 11:08:36奥运会纪念徽章:射击
日期:2012-09-11 08:56:18奥运会纪念徽章:体操
日期:2012-10-25 09:07:51紫蛋头
日期:2012-12-10 13:46:51灰彻蛋
日期:2013-01-28 14:23:202013年新春福章
日期:2013-02-25 14:51:24
发表于 2010-12-14 22:11 | 显示全部楼层
你先把语名改一下,看一下查询要多长时间

select  A.END_DT from  OFR_CHILD_ASSET_N_HIST A
WHERE A.ASSET_ROW_ID IN
         (SELECT TRIM(ASSET_ROW_ID) FROM OFR_CHILD_ASSET_N_HIST_PATCH)
     AND A.END_DT = '30001231')

使用道具 举报

回复
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2010-12-15 12:26 | 显示全部楼层
SQL> select  A.END_DT from  SXMART.OFR_CHILD_ASSET_N_HIST A
  2  WHERE A.ASSET_ROW_ID IN
  3           (SELECT TRIM(ASSET_ROW_ID) FROM SXMART.OFR_CHILD_ASSET_N_HIST_PATCH)
  4       AND A.END_DT = '30001231';

已选择245067行。

已用时间:  02: 18: 07.94

执行计划
----------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name                   | Rows  | Bytes |TempSpc| Cost (%CPU)| Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                        |   229K|  6488K|       | 29754   (1)|     |       |
|*  1 |  HASH JOIN RIGHT SEMI               |                        |   229K|  6488K|  3344K| 29754   (1)|     |       |
|   2 |   INDEX FAST FULL SCAN              | IND_ASSET_ROW_ID       |   155K|  1517K|       |    82   (2)|     |       |
|   3 |   PARTITION RANGE ALL               |                        |   229K|  4251K|       | 29168   (1)|   1 |  2555 |
|   4 |    TABLE ACCESS BY LOCAL INDEX ROWID| OFR_CHILD_ASSET_N_HIST |   229K|  4251K|       | 29168   (1)|   1 |  2555 |
|*  5 |     INDEX RANGE SCAN                | IND_END_DT             |   229K|       |       |  5756   (1)|   1 |  2555 |
---------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("A"."ASSET_ROW_ID"=TRIM("ASSET_ROW_ID"))
   5 - access("A"."END_DT"='30001231')

Note
-----
   - 'PLAN_TABLE' is old version




统计信息
----------------------------------------------------------
          1  recursive calls
          0  db block gets
     990022  consistent gets
     956380  physical reads
       5080  redo size
    4215568  bytes sent via SQL*Net to client
     180199  bytes received via SQL*Net from client
      16339  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
     245067  rows processed

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51
发表于 2010-12-15 13:17 | 显示全部楼层
END_DT 选择性怎么样啊?
还有END_DT的是LOCAL index,改成全局索引试试

使用道具 举报

回复
论坛徽章:
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
发表于 2010-12-15 13:43 | 显示全部楼层
我觉得你这个还是应该从那个trim函数入手,因为SQL基本也就这样了,就两个选择条件
如果能不用函数的话,开销会小很多

使用道具 举报

回复
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2010-12-15 14:08 | 显示全部楼层
TRIM(ASSET_ROW_ID)上创建函数索引ind_ASSET_ROW_ID

执行计划中:
  2 |   INDEX FAST FULL SCAN              | IND_ASSET_ROW_ID

使用道具 举报

回复

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

本版积分规则 发表回复

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