我是Oracle的新手。不过,我已经使用过Microsoft SQL Server多年了。我被带入了一个已经过期且超出预算的项目,我需要成为“Oracle专家”。我有一张有1400万行的表。我有一个复杂的查询来更新表。但我将从简单的查询开始。当我发出修改少量记录的简单更新(100到大约10,000个左右)时,表扫描表并更新受影响的记录所花费的时间不会超过2到5分钟。 (如果查询可以使用索引,则时间更短。)但是,如果我使用:
更新整个表UPDATE MyTable SET MyFlag = 1;
然后需要3个小时!
如果表扫描在几分钟内完成,为什么这需要几个小时?我当然可以使用一些建议来解决这个问题,因为我没有足够的Oracle经验来了解要运行的诊断查询。 (我使用的是Oracle 11g并使用Oracle SQL Developer作为客户端。)
感谢。
答案 0 :(得分:4)
当您在Oracle中执行UPDATE
时,您正在修改的数据将被顺序附加到重做日志,然后通过名为CHECKPOINT
的进程在数据块中分发。
此外,旧版本的数据被复制到UNDO
空间,以支持可能的事务回滚以及通过并发进程访问旧版本的数据。
这可能比不修改数据的纯读操作花费更多的时间。