创建的表与通过列添加创建的表之间是否存在性能差异?

时间:2009-02-09 01:47:18

标签: database-design alter-table

快速提问,我很好奇,如果一次性定义的数据库表与一段时间内添加了列的数据库表之间存在任何差异。添加了列的性能是否会受到影响?

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

由于

3 个答案:

答案 0 :(得分:3)

这里有 供应商差异。 SQL语言由标准定义,但存储详细信息留给每个供应商实现。

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

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

答案 1 :(得分:2)

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

因此,如果要将填充列添加到包含行的表中,则可能需要重命名原始表并执行“create table as select”以创建和填充新版本。当然也必须迁移索引,触发器,权限等。但是,如果表不是太大,您可以添加填充的列,从而导致行迁移导致性能下降,然后执行表移动以重新组织它。

答案 2 :(得分:1)

这将完全取决于存储引擎。一般来说,添加色谱柱后可能会非常舒服,也许是在向它们扔掉OPTIMIZE TABLE之后。