【问题标题】:Oracle performance of schema changes as compared to MySQL ALTER TABLE?与 MySQL ALTER TABLE 相比,Oracle 架构更改的性能?
【发布时间】:2010-02-05 06:44:48
【问题描述】:

当使用 MySQL MyISAM 表并发出 ALTER TABLE 语句来添加列时,MySQL 会创建一个临时表并将所有数据复制到新表中,然后再覆盖原始表。

如果该表有大量数据,此过程可能会非常缓慢(尤其是在重建索引时),并且需要您在磁盘上有足够的可用空间来存储该表的 2 个副本。这很烦人。

Oracle 在添加列时如何工作?在大桌子上速度快吗?

我一直对能够在没有大量停机时间的情况下进行架构更改感兴趣。我们一直在向我们的软件添加新功能,这些新功能需要在每个版本中更改架构。任何建议表示赞赏...

【问题讨论】:

    标签: mysql oracle


    【解决方案1】:

    在 Oracle 的大表中添加没有数据的列通常非常快。没有数据的临时副本,也不需要重建索引。当您想要将一列添加到一个大表并将数据回填到所有现有行的新列中时,通常会出现缓慢,因为现在您正在谈论影响大量行的 UPDATE 语句。

    随着时间的推移,添加列可能会导致行迁移。如果您有一个 80% 的块,有 4 行,并且您添加的列会随着时间的推移将每行的大小增加 30%,那么您最终将达到 Oracle 必须将 4 行之一移动到不同位置的地步。堵塞。它通过在旧块中留下指向新块的指针来实现这一点,这会导致对该迁移行的读取需要更多 I/O。消除迁移的行可能会有些昂贵,尽管假设您使用的是企业版,通常可以在不停机的情况下做到这一点,但如果您有一点停机时间,通常会更容易。但是行迁移是您通常只需要担心的事情。如果您知道某些表的行大小将来可能会大幅增加,您可以通过为表指定更大的 PCTFREE 设置来提前缓解问题。

    【讨论】:

    • 我很确定你的意思是“如果你有一个 80% 的块,有 4 行”,是吗?
    【解决方案2】:

    关于停机时间,更改表(以及一系列其他 DDL 操作)需要排他锁。然而,Oracle 也可以使用 DBMS_REDEFINITION 包执行对象的在线重新定义,这确实可以减少停机时间。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 2012-03-11
    • 2010-12-21
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2018-11-17
    • 2012-01-18
    相关资源
    最近更新 更多