【问题标题】:Oracle Performance IssuesOracle 性能问题
【发布时间】: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


【解决方案1】:

当您在 Oracle 中执行UPDATE 时,您正在修改的数据会按顺序附加到重做日志中,然后通过称为CHECKPOINT 的进程分布在数据块中。

另外,旧版本的数据被复制到UNDO空间,以支持可能的事务回滚和并发进程访问旧版本的数据。

这一切都可能比不修改数据的纯读取操作花费更多的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2018-01-29
    • 2011-04-25
    相关资源
    最近更新 更多