更新null值将拆分Postgresql文件中的行



我有一位同事告诉我,我们将default值而不是null值添加到表中的原因是,当存储新行时,Postgresql会为文件分配大量字节。如果稍后更新此列,它可能会将该行拆分为文件中的两行,并且在读取和写入时必须执行多个IO操作。

我根本不是一个Postgresql专家,我很难找到任何建议这一点的文档。有人能帮我澄清一下吗?这是不是在列中不使用null值,而是使用一些default的好理由?在这种情况下,休斯的表现会有问题吗?

我不确定我会说文档很难找到:

  • https://www.postgresql.org/docs/10/storage-file-layout.html
  • https://www.postgresql.org/docs/current/storage-page-layout.html

可以公平地说,还有很多东西需要吸收。

所以,你应该有默认值而不是NULL的原因是因为你不想有一个";未知";在您的专栏中。在担心效率调整之前,先从需求开始。

特定值是否为null存储在位图中。此位图是可选的,因此如果一行中没有null,则不会创建位图。因此,这表明null会使行变大。但是等等,如果一个位被设置为显示null,那么你就不需要值结构的开销,并且(IIRC-你需要检查文档(最终可以节省你的空间。不过,一般的每行开销和类型对齐问题对您来说可能要重要得多。

然而,所有这些都忽略了文件室中的大象*,也就是说,如果你更新了一行,那么PostgreSQL会将该行的当前版本标记为过期,并创建一个全新的行。因此,在你写的第一段中,对更新工作方式的全部描述都很混乱。

所以,在99.9%的情况下,不要担心null的效率。要担心正确使用它们,以及数据库的一般结构、索引和查询。

不,我不会为那个双关语道歉。

最新更新