我有一张有60列的桌子。其中的20个是“ NotEmpty”和6个“ NotNull”。
我有空值和空值(在我的情况下,它们始终表示“无数据”)。我想只用一种约束来统一列。
我已读取null值很便宜(以字节为单位)。那么也许使用NotEmpty约束?但是,也许NotNull约束的执行效果更好?或者coalesce()在检索数据时最好同时拥有值和用途?
coalesce()
什么是成本CHECK的制约INSERT和UPDATEPostgres里9.x中?您的经历如何?有基准吗?
CHECK
INSERT
UPDATE
有些人试图避免NULL价值观,声称这种逻辑会造成混乱。
NULL
我不是其中之一。NULL值仅适用于没有数据的列。它们无疑是存储“空”列的最便宜的方式-磁盘空间和性能(主要影响是较小的表和索引)
一旦 了解 了NULL价值的本质,就没有理由避免它们。Postgres提供了多种函数来处理NULL。colaesce(),nullif(),concat(),concat_ws(),…
colaesce()
nullif()
concat()
concat_ws()
通常,就 性能 而言, NOT NULL约束 胜过 CHECK约束, 并且两者均由对数 触发触发 。但是,即使是简单的触发器也很便宜。NOT NULL约束的成本几乎为零。同样,所有这些仅影响写操作,但是在大多数应用程序中,读操作占主导地位。
NOT NULL
因此,对性能(除次优索引和查询之外)的影响 最大的 是表和索引的 大小 ,或更重要 的是每个数据页的元组数 。在大多数情况下,较大的元组会导致性能降低。满足查询所必须读取的数据页数相应增加。可用的高速缓存内存已较早饱和。
我还没有基准测试,但是最好还是针对您的特定环境进行测试。这些只是简单的经验法则。现实要复杂得多。