提交oracle sql中的任何记录

时间:2015-09-12 12:59:49

标签: sql oracle performance query-optimization

我有一个脚本需要很长时间来更新6000万条记录。这是查询:

UPDATE baseinformation w
SET good_item_id = (SELECT id FROM item e WHERE e.id = w.id)

我的问题:我想在查询运行时提交任何记录。我想在另一个会话中提交SQL中的任何更改记录。我的问题在LOOP的PLSQL中解决了。在我的目标中,纯Oracle SQL中是否有解决方案或命令?

4 个答案:

答案 0 :(得分:0)

您应该了解您使用的update语句是原子的。它只能在整个语句成功执行后commit,即在您的情况下更新baseinformation表。无法为更新的每条记录发出commit。这是为了在数据库中实现一致性,以便其他用户在执行update时看不到错误记录。如果在此过程中发生错误,则回滚事务。

答案 1 :(得分:0)

您应该可以通过在sql中添加limit子句来实现此目的。查询应返回更新的行数。在调用代码中设置一个while循环,并使用limit子句调用查询,直到它返回0.这样的事情(这是我的头脑,可能不是Oracle的确切语法)

update baseinformation w 
set good_item_id = 
  (select id from item e where e.id = w.id 
   and e.id != w.id 
   and ROWNUM <= 1000);

答案 2 :(得分:-1)

你真的需要每次更新每条记录吗?你可以这样做:

update baseinformation w 
set good_item_id = (select id from item e where e.id = w.id 
and e.id != w.id) 

答案 3 :(得分:-2)

花时间的原因是列上可能会有索引会消耗更多时间。如果您尝试删除索引并执行,它可能会起作用。此外,一旦您开始执行记录上的锁定将保持到您的会话,直到您提交。因此,您无法在另一个会话中执行该语句。