【发布时间】:2013-04-03 19:09:37
【问题描述】:
我是 Oracle 的新手。不过,我已经使用 Microsoft SQL Server 多年。我被带入了一个已经逾期且超出预算的项目,我需要成为“Oracle 专家”。我有一张有 1400 万行的表。而且我有一个更新表的复杂查询。但我将从简单的查询开始。当我发布一个修改少量记录(100 到 10,000 左右)的简单更新时,表扫描表并更新受影响的记录不超过 2 到 5 分钟。 (如果查询可以使用索引,时间会更短。)但是如果我更新整个表:
UPDATE MyTable SET MyFlag = 1;
然后需要3个小时!
如果表扫描在几分钟内完成,为什么要花几个小时?我当然可以就如何解决这个问题提出一些建议,因为我没有足够的 Oracle 经验来知道要运行哪些诊断查询。 (我在 Oracle 11g 上并使用 Oracle SQL Developer 作为客户端。)
谢谢。
【问题讨论】:
-
UPDATE涉及写入撤消和重做数据以及更新索引。这不仅仅是表扫描。 -
如果很多行已经将
MyFlag设置为1,那么update MyTable set MyFlag = 1 where MyFlag <> 1的性能会更好。此外,如果您必须更新所有行,通过先删除索引和触发器,然后执行更新,然后重新创建触发器和索引,您将获得更好的性能。 -
@GriffeyDog - 注意 MyFlag 是否可以为空
-
@JeffreyKemp 当然可以。如果是这种情况,请将其更改为
where MyFlag is null or MyFlag <> 1。我还应该建议禁用触发器而不是丢弃它们。 -
我刚回到这里将一个帖子标记为我的答案,但该帖子已被删除。我不确定在他的情况下应该有什么适当的礼仪。我是否将剩余的答案标记为我接受的答案?
标签: sql performance oracle