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

Database design 创建的表与通过列添加创建的表之间是否存在性能差异?,database-design,alter-table,Database Design,Alter Table,快速提问,我很好奇在一个快照中定义的数据库表和一个随着时间的推移添加了列的数据库表之间是否有任何区别。添加了列的那一个在某种程度上会影响性能吗 无论如何,数据库供应商在这里不太相关,除非在这种情况下存在供应商差异 谢谢,这将完全依赖于存储引擎。一般来说,我会对添加的列感到非常满意,可能是在向它们抛出优化表之后。这将完全依赖于存储引擎。一般来说,我会对添加的列感到非常满意,可能是在向它们抛出优化表之后。这里有供应商的差异。SQL语言由一个标准定义,但存储详细信息留给每个供应商来实现 例如,在MyS

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

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


谢谢,这将完全依赖于存储引擎。一般来说,我会对添加的列感到非常满意,可能是在向它们抛出优化表之后。

这将完全依赖于存储引擎。一般来说,我会对添加的列感到非常满意,可能是在向它们抛出优化表之后。

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

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

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

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

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


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

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


因此,如果要将填充的列添加到包含行的表中,则可能需要重命名原始表并执行“按选择创建表”创建和填充新版本。索引、触发器、权限等当然也必须迁移。但是,如果表不是太大,您可以添加填充的列,承受行迁移带来的性能损失,然后执行表移动以重新组织。在Oracle中,您可以向existi添加空列填充表时,除表结构的逻辑重新定义外,基本上不会发生任何结果。但是,当填充这些列时(当然,在添加列时可能会出现这种情况),则行必须扩展,并且可能会遇到以下问题:某些行在符合以下条件的块中没有足够的可用空间:tain它们,在这种情况下,它们将被迁移到另一个块,指针保留在原始位置(因此索引在继续指向原始位置时不受影响)


因此,如果要将填充的列添加到包含行的表中,则可能需要重命名原始表并执行“按选择创建表”创建和填充新版本。索引、触发器、权限等当然也必须迁移。但是,如果表不是太大,您可以添加填充的列,承受行迁移带来的性能损失,然后执行表移动来重新组织它。

感谢Oracle的建议,我正好是当出现这种情况时,使用Oracle DB!请记住,这种情况实际上与使用列越来越大的表是一样的——行迁移始终是一个问题,并且总是有一些方法可以缓解它。感谢Oracle的建议,当出现这种情况时,正好我正在使用Oracle DB!请记住因此,这种情况实际上与拥有一个列越来越大的表是一样的——行迁移始终是一个问题,并且总是有一些方法可以缓解它。