是否设置为“NOT NULL”关于PostgreSQL的性能增加一列?(Does setting “

2019-07-31 07:09发布

我知道这是在MySQL中是一个好主意。 如果我没有记错,在MySQL允许索引来提高工作效率。

Answer 1:

它总是一个美好的理想,以保持列被空,如果你能避免它,因为使用的语义是如此凌乱; 看到什么是带有NULL的交易? 对于如何将这些可以让你陷入困境良好的讨论。

在PostgreSQL的版本到8.2,该软件不知道该怎么办上的方式,将包括在其中找到NULL值最常见的类型索引(b树)的比较。 在相关位上的索引类型的文档 ,你可以看到,可谓“但要注意,IS NULL不等于=,不可转位”。 有效缺点是,如果你指定一个查询,需要包括NULL值,计划可能无法使用这种情况下,明显的索引来满足它。 举个简单的例子,如果你有一个ORDER BY语句,可能与索引加快,但你的查询需要太多返回NULL值,优化器不能使用该索引,因为结果将丢失任何NULL数据 - 和因此是不完全的和无用的。 优化知道这一点,而是会做表代替,这可能是非常昂贵的没有索引的扫描。

的PostgreSQL 在8.3改进此 ,“一个IS上的索引列NULL条件可以用B树索引用”。 所以,在这里你可以通过尝试一些指标与NULL值被烧毁的情况已经减少。 但由于NULL语义还是很痛苦的,你可能会遇到一种情况,即使是8.3策划师不会做你所期望的,因为他们的,你还是应该使用NOT NULL尽可能降低您的运行到一个非常优化的查询的机会。



Answer 2:

设置NOT NULL对性能没有影响本身。 几个周期的检查 - 无关。

但是你可以提高实际使用NULL值,而不是虚值的表现。 根据数据类型,可以节省大量的磁盘空间和内存 ,从而加快了..一切。

如果有中的任何NULL值的零位时,才会分配。 这是该行(NULL与否)在列一个位。 对于表达8列中的零位图是有效完全免费的,使用元组报头和行数据之间的备用字节。 在此之后,空间中的倍数分配MAXALIGN (通常为8个字节,覆盖64列)。 所不同的是输给了填充。 所以,你付全(低!)价格为每行的第一个NULL值 。 其他NULL值只能节省空间。

对于任何非空值的最小存储要求为1个字节( boolean"char" ,...)或通常 ,加上用于对准(可能)填充。 阅读上的数据类型或检查在系统表中的血淋淋的细节pg_type

更多关于空存储:

  • 不使用PostgreSQL的NULL仍然使用在头一个NULL位图?
  • 该手册。


Answer 3:

不,只要你不实际存储NULL值在表中的索引将看起来完全一样(和同样有效)。

将列设置为NOT NULL有很多其他的优点,因此,您应该始终将其设置为,当你不打算在其中存储的NULL :-)



文章来源: Does setting “NOT NULL” on a column in postgresql increase performance?