我想知道是否有一些基准来比较在60列的表上插入一些检查约束的成本,其中20我想插入NotEmpty约束和6行NotNull。
我的情况是我在我的桌子上有空值和空值(在我的情况下,这意味着总是“没有数据”)。
我想用一个统一数据值。
这就是我想在列上插入NotEmpty约束的原因,因为我读取的空值不像空值那么重(以字节大小)(并且尊重他的真实含义)。
但是从另一方面来看NotNull Constraint比检查约束更深层次,也许它表现更好......
当我做这种改变时,我提出了这个问题: - 在INSERT和UPDATE操作中Postgres 9.x中的成本检查约束多少?
因为如果花费很多,那么这两种情况下的情况可能会更好,而且当我使用合并函数检索它时...
您的经历或基准是什么?
答案 0 :(得分:3)
有些人试图避免使用NULL
值,声称逻辑会令人困惑。
我不是其中之一。 NULL
值适用于没有数据的列。它们肯定是最便宜的储存方式。列 - 用于磁盘空间和性能(主要影响是较小的表和索引):
Does not using NULL in PostgreSQL still use a NULL bitmap in the header?
Does setting "NOT NULL" on a column in postgresql increase performance?
Do nullable columns occupy additional space in PostgreSQL?
一旦理解 NULL
值的性质,就没有理由避免它们。 Postgres提供了各种处理NULL的函数。 colaesce()
,nullif()
,concat()
, concat_ws()
,...
一般来说,就效果而言, NOT NULL约束胜过 CHECK约束并且都击败了触发器强>通过日志拍摄。但即便是简单的诱因也很便宜。 NOT NULL
约束的成本几乎为零。此外,所有这些仅影响写操作,但在大多数应用程序中,读操作占主导地位。
因此,对性能(次优索引和查询除外)的最相关影响是表和索引的大小,或者更重要的是,每个数据页的元组数。对于大多数用例而言,较大的元组会导致性能降低。必须读取以满足查询的数据页数相应增加。可用的高速缓存存储器早先已经饱和。
我没有准备基准,但无论如何最好测试你的特定环境。这些只是简单的经验法则。现实要复杂得多。