请高人帮忙优化一条UPDATE语句

alunone 2010-03-04 11:00:23
UPDATE A
SET A.YE=(SELECT SUM(NVL(B.J_F,0.00))
FROM B
WHERE A.BH=B.BH
AND B.BB=0
AND (B.SCBJ IS NULL OR B.SCBJ ='N')
AND B.LRRQ<'2010-01-01')
WHERE A.BB=0 AND A.YEAR=2010 AND A.MONTH=1 AND A.GSID IS NULL;

测试数据A表大约5000条数据,B表大约50000条数据,B表数据量随时间增,可能达到500000条
按说数据库量不大,可是这个简单的语句在PLUS里竟然要执行10多分钟,现在对表没建任何索引
请各位帮忙看一下怎么优化最好


...全文
92 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqlife 2010-03-05
  • 打赏
  • 举报
回复
你先确定是查询慢,还是更新慢,还是两者都慢.....
然后在优化
小灰狼W 2010-03-05
  • 打赏
  • 举报
回复
在B表的相关字段上建联合索引
看看执行过程中表A有没有被别的会话锁住而挂起
nycle_1113 2010-03-05
  • 打赏
  • 举报
回复
update实际上是先找到数据(select),再更新数据(set)数据的,所以可以先把SQL改成查询语句,分析一下执行计划。
alunone 2010-03-05
  • 打赏
  • 举报
回复
引用 6 楼 java3344520 的回复:
你先确定是查询慢,还是更新慢,还是两者都慢.....
然后在优化

更新慢
alunone 2010-03-04
  • 打赏
  • 举报
回复
引用 3 楼 lumeixin9 的回复:
在 A.BH=B.BH 这两字段都建索引看速度怎样。。。。

建立索引后速度无明显变化
lumeixin9 2010-03-04
  • 打赏
  • 举报
回复
在 A.BH=B.BH 这两字段都建索引看速度怎样。。。。
alunone 2010-03-04
  • 打赏
  • 举报
回复
UPDATE A
SET A.YE=(SELECT SUM(NVL(B.J_F,0.00))
FROM B
WHERE A.BH=B.BH
AND B.BB=0
AND (B.SCBJ IS NULL OR B.SCBJ ='N')
AND B.LRRQ <'2010-01-01')
WHERE exists ( SELECT 1 FROM B
WHERE A.BH=B.BH
AND B.BB=0
AND (B.SCBJ IS NULL OR B.SCBJ ='N')
AND B.LRRQ <'2010-01-01'
)AND A.BB=0 AND A.YEAR=2010 AND A.MONTH=1 AND A.GSID IS NULL;
速度提高了,但是还是时间超过1S,不知道还有没有别的办法
alunone 2010-03-04
  • 打赏
  • 举报
回复
UPDATE A
SET A.YE=(SELECT SUM(NVL(B.J_F,0.00))
FROM B
WHERE A.BH=B.BH )
就是把别的条件都去掉,如上,速度也很慢,这个ORACLE和MS/SQL怎么差距这么大

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧