1

我有一张有 60 列的表。其中 20 个是“NotEmpty”和 6 个“NotNull”。

我有空值和 Null 值(在我的情况下总是意味着“没有数据”)。我想用一种约束来统一列。

我读过空值很便宜(以字节为单位)。所以也许使用 NotEmpty 约束?但也许 NotNull 约束表现更好?或者coalesce()在检索数据时最好同时拥有值和使用?

Postgres 9.x的CHECK约束成本是多少?你的经历如何?任何基准?INSERTUPDATE

4

1 回答 1

5

有些人试图避免NULL价值观,声称逻辑会令人困惑。

我不是其中之一。NULL值适用于没有数据的列。它们当然是存储“空”列的最便宜的方式——对于磁盘空间和性能(主要影响是更小的表和索引):

一旦你了解了价值观的本质,NULL就没有理由回避它们。Postgres 提供了多种函数来处理 NULL。colaesce(), nullif(), concat(),concat_ws() , ...

一般来说,就性能而言,NOT NULL 约束优于CHECK 约束,并且两者都通过 log shot击败触发器。但即使是简单的触发器也很便宜。约束的成本NOT NULL几乎为零。此外,所有这些都只影响写操作,但在大多数应用程序中,读操作占主导地位。

因此,对性能最相关的影响(次优索引和查询除外)是表和索引的大小,或者更重要的是,每个数据页的元组数。对于大多数用例,较大的元组会导致性能下降。为满足查询而必须读取的数据页数相应增加。可用缓存内存较早饱和。

我没有准备好基准测试,但最好还是针对您的特定环境进行测试。这些只是简单的经验法则。现实要复杂得多。

于 2013-10-02T15:48:54.783 回答