2009-03-05 44 views
3

当使用MySQL MyISAM表并发出ALTER TABLE语句来添加列时,MySQL会创建一个临时表并在覆盖原始表之前将所有数据复制到新表中。与Oracle ALTER TABLE相比,Oracle的模式更改性能如何?

如果表中有很多数据,(重建索引时,特别是),这个过程可能会非常缓慢,并且需要您在磁盘上有足够的空间来存储表2份。这非常烦人。

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

我一直感兴趣的是能够做架构更改,而无需大量的停机时间。我们一直在为我们的软件添加新功能,这些功能需要在每个发行版中更改架构任何建议表示赞赏...

回答

6

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

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

+0

我敢肯定你的意思是“如果你有一个块中存满了4行80%”,是吗? – Khb 2009-03-05 01:45:05

+0

非常正确,是的。谢谢。 – 2009-03-05 03:38:39

2

关于停机时间,改变表(和一群其他DDL操作的)取的排他锁。不过,Oracle也可以使用DBMS_REDEFINITION软件包在线重新定义oobjects,这确实可以缩短停机时间。