高分求助!将一个sql文优化(现在的执行效率太低了),谢谢。

Iris 2005-11-09 12:02:30
SQL文如下:
UPDATE tableA
SET FLAG = 1
WHERE FLAG <> 1
AND fieldA NOT IN
(SELECT substr(fieldA,1,8)||max(substr(fieldA,9,2))
FROM tableA
GROUP BY substr(fieldA,1,8))

他的功能是,将表A中的若干条记录的flag设置成1,条件是:
如果该表中fieldA列的值的前8位相同,那么将后两位中不是最大的纪录进行设置,
举个例子:
如果fieldA的值有AAAAAAAA01,AAAAAAAA02,AAAAAAAA03,
那么将AAAAAAAA01,AAAAAAAA02对应的纪录的flag进行设置。
现在表A中有两万条数据,上述sql文执行需要6分钟,怎么才能提高效率呢。谢谢!
...全文
106 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinjazz 2005-11-09
  • 打赏
  • 举报
回复
应该用exists子句
kulama2004 2005-11-09
  • 打赏
  • 举报
回复
1.explain plan你的sql语句
UPDATE tableA
SET FLAG = 1
WHERE FLAG <> 1
AND fieldA NOT IN
(SELECT substr(fieldA,1,8)||max(substr(fieldA,9,2))
FROM tableA
GROUP BY substr(fieldA,1,8))
看看到底那里cost比较大,问题出在哪里

2.tableA的FLAGH和fieldA字段有没有作过index?没有就加index


3 not in 和not exists不是一定说哪个更快,不能一概而论,有时候是not in快,有时候是not exists快,有时候一样快,关键还是要看执行计划,不能人云亦云
xjqqxjqq 2005-11-09
  • 打赏
  • 举报
回复
UPDATE tableA a
SET FLAG = 1
WHERE FLAG <> 1
AND NOT EXISTS
(SELECT 1
FROM tableA b
where a.fieldA=substr(b.fieldA,1,8)||max(substr(b.fieldA,9,2))
GROUP BY substr(fieldA,1,8))
试试吧
xujiaqiang 2005-11-09
  • 打赏
  • 举报
回复
flag上建立bitmap索引,将flag<>1改为 flag > 1 || flag < 1

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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