我有一个数以十亿计的行数的表。假设我想在那个表中添加一个列。我想知道幕后发生了什么,知道这个查询的成本,预期的时间。
关系数据库不是将行数据指针存储在一起吗?因此,它必须查找每一行才能将所添加列的指针添加到磁盘上该行块的末尾?这是我目前的理解。
发布于 2020-02-19 10:41:12
在波斯特格斯什么都没有发生。
它只是向系统目录中添加一行,以便它知道您添加了一列。它甚至不触及表数据。因此,即使在一个有10亿行的表上,一旦它能够获得表上的独占锁,这也只需要几毫秒。
从Postgres 11开始,添加一个以常量作为默认值的NULL列时甚至是这样的,例如add some_flag integer not null default 42
如果默认值是一个易失性函数(例如current_timestamp),Postgres将被迫对每一行调用一次,并输入结果。然后,这将花费大量的时间来添加包含数十亿行的列。
发布于 2020-02-19 11:03:55
对于MySQL,我找到了2018年5月的文章:https://mysqlserverteam.com/mysql-8-0-innodb-now-supports-instant-add-column/
MySQL 8.0: InnoDB现在支持即时添加列字典,InnoDB,MySQLDDL operationBin Su即时DDL长期以来一直是请求最多的InnoDB特性之一。随着越来越大和快速增长的数据集,立即执行DDL的能力是任何web规模数据库中必须具备的功能。开发人员经常需要添加新的列来满足不断变化的业务需求。立即添加列的能力是我们计划立即执行的一系列DDL语句中的第一个。在MySQL 8.0中使用一个新的事务性数据字典使这项任务更加容易。在MySQL 8.0之前,元数据(数据字典)存储在称为.frm文件的平面文件中。.frm文件是一种神秘的格式,很久以前就已经过时了。
在此之后,本文将提供更多关于过去的细节(5.6版),以及它是如何完成的。
https://dba.stackexchange.com/questions/260012
复制相似问题