1

快速提问,我很好奇一次性定义的数据库表和随着时间的推移添加了列的数据库表之间是否有任何区别。增加列性能的那一个会在某种程度上受到影响吗?

无论如何,数据库供应商在这里并不太相关,除非这种情况下存在供应商差异。

谢谢

4

3 回答 3

3

这里存在供应商差异。SQL 语言是由标准定义的,但存储细节留给每个供应商来实现。

例如,在 MySQL 中,当您添加一列时,数据库引擎会复制整个表,为每一行的新列腾出空间。一旦它复制了所有行,它就会删除表的旧副本。因此,新表的存储方式与您从一开始就使用新列定义它一样。但是您必须等待副本完成才能ALTER TABLE返回(如果表很大,这可能需要很长时间)。

在另一个品牌的数据库中(尽管我没有想到),添加一列可能会将额外的列与原始表分开存储。这将有助于快速添加新列,但检索数据会受到数据断开部分的影响。大概您以后可以告诉数据库引擎对表进行“碎片整理”并将所有列放在一起。

于 2009-02-09T02:02:17.423 回答
2

在 Oracle 中,您可以将空列添加到现有的填充表中,除了表结构的逻辑重新定义之外,基本上不会发生任何事情。但是,当您填充这些列时,这当然可能在添加列时发生,然后行必须扩展,并且您可能会遇到一些问题,即某些行在包含它们的块中没有足够的可用空间,在这种情况下它们将被迁移到不同的块,指针留在原始位置(因此索引不受影响,因为它们继续指向原始位置)。

因此,如果您将填充的列添加到其中包含行的表中,那么您可能希望重命名原始表并执行“create table as select”来创建和填充新版本。索引、触发器、特权等当然也必须迁移。但是,如果表不是太大,您可以添加填充的列,由于行迁移而降低性能,然后执行表移动以重新组织它。

于 2009-02-09T23:54:32.090 回答
1

这将完全取决于存储引擎。一般来说,我会对添加的列感到非常满意,也许是在向它们扔一个 OPTIMIZE TABLE 之后。

于 2009-02-09T02:00:34.527 回答