SQL语句:update优化问题

[复制链接]
查看11 | 回复9 | 2010-3-1 11:04:58 | 显示全部楼层 |阅读模式
要把表ac01 中部分字段更新到ac02中数据量:ac01 (80W)---ac02(100W)
,两者通过aac001关联,ac02表主键为aac001,ac01的aac001则有可能重复。具体语句为:
update ac02 a
set (AAE011, AAE036, AAE043) = (select AAE011, AAE036, BAC012

from ac01 a

where b.aac001 = a.aac001

and rownum = 1);

开机跑了一晚上都没有结果,问有什么好的优化方法?
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
把执行计划贴上来
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT

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


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



| Id| Operation
|Name
| Rows| Bytes | Cost
|



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



| 0 | UPDATE STATEMENT
|
|5244 | 158K| 7
PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------
|



| 1 |UPDATE
| AC02
| | |
|



| 2 | TABLE ACCESS FULL | AC02
|5244 | 158K| 7
|



|*3 | COUNT STOPKEY
|
| | |
|



PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------
| 4 |TABLE ACCESS BY INDEX ROWID| AC01
|91 |3367 | 2
|



| 5 | NESTED LOOPS
|
| 548K|29M| 12612
|



|*6 |TABLE ACCESS FULL| AC01
|6015 | 117K| 582
|



|*7 |INDEX RANGE SCAN | IDX_AC01_AAC001|7596 | | 1
|

PLAN_TABLE_OUTPUT

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


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





Predicate Information (identified by operation id):

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



3 - filter(ROWNUM=1)

6 - filter("B"."PER_ID"=TO_NUMBER(:B1))

7 - access("B"."AAC001"="C"."AAC001")

PLAN_TABLE_OUTPUT

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


Note: cpu costing is off

已选择22行。
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
update ac02 a
set (AAE011, AAE036, AAE043) = (select AAE011, AAE036, BAC012

from ac01 a

where b.aac001 = a.aac001

)
where exists(select 1 fromfrom ac01 a

where b.aac001 = a.aac001)试试看
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
update ac02 a
set (AAE011, AAE036, AAE043) = (select AAE011, AAE036, BAC012

from ac01 a

where b.aac001 = a.aac001

)
where exists(select 1 from ac01 a

where b.aac001 = a.aac001);
也尝试了。。一样执行不起来
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
原帖由 fbymistake 于 2008-10-20 16:24 发表
要把表ac01 中部分字段更新到ac02中数据量:ac01 (80W)---ac02(100W)
,两者通过aac001关联,ac02表主键为aac001,ac01的aac001则有可能重复。具体语句为:
update ac02 a
set (AAE011, AAE036, AAE043) = (select AAE011, AAE036, BAC012

from ac01 a

where b.aac001 = a.aac001

and rownum = 1);

开机跑了一晚上都没有结果,问有什么好的优化方法?

b.aac001 ?请问 b 表是哪个?
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
update ac02 a
set (AAE011, AAE036, AAE043) = (select AAE011, AAE036, BAC012

from ac01 b

where b.aac001 = a.aac001

and rownum = 1);
搞错。。。
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
数据量多大?
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
哦,数据量很大的
回复

使用道具 举报

千问 | 2010-3-1 11:04:58 | 显示全部楼层
表ac01,ac02的字段aac001都要有索引
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行