NULL vs NOT NULL性能差异

时间:2018-01-04 12:07:04

标签: sql sql-server performance null

最近我正在查看我们的SQL表并注意到以下内容。

    [FooColumn] CHAR (1) DEFAULT ('N') NOT NULL,

上面你可以看到FooColumn总是默认为' N'但仍然有一个" NOT NULL"指定。

将列设置为" NOT NULL"是否存在一些存储/性能差异?而不是" NULL" ?

SQL Server如何处理" NOT NULL:与" NULL"不同?专栏?

注意:这仅适用于SQL,而不是外部执行NULL检查的开销

4 个答案:

答案 0 :(得分:4)

只有在有原因时才应使用NOT NULL(即UI或后端关系的必填字段)。 NOT NULL vs NULL性能可以忽略不计,根据this article from 2016 (SQL SERVER),在决定NOT NULL vs NULL时,性能不应该是一个考虑因素。

即使该字段默认为N'如果允许空值,命令仍然可以将其设置为NULL。归结为NULL是该列的有效数据。

修改

在数据驱动的技术应用程序中,根据我的经验,这些是我们使用的一些指导原则:

  • 对于数字字段,用户不知道NULL,并且所有数字都有意义。
  • 表示字符串字段,NULL和""与用户完全相同,因此它取决于您的后端应用程序。
  • 我知道你的问题是排除了ISNULL检查,但如果你做了很多,那么可能是代码味道,如果可能的话,那些字段应该是非空的,因为它们会变得昂贵。

答案 1 :(得分:3)

这是一场复杂的辩论"。

NULL表示未知。它与0或空字符串不同。

NOT NULL意味着你需要在那里插入一个值,即使它是一个空白字符串或0,许多设计师都认为这是一个更好的设计。其他人看不到有NULL值的问题。不同的软件公司将执行不同的规则。

拥有"默认" value只是意味着当您创建新记录而不指定值时,它将使用默认值。无论字段是NULL还是NOT NULL,都是如此。

拥有NULL值可能会对性能产生影响(因为DBMS需要处理这种特殊情况),它将取决于您使用的是哪个DBMS,哪个版本,哪个配置等...您需要做台式工作 - 使用您自己的设置进行标记,看看它是什么。

这是一篇好文章:http://www.itprotoday.com/microsoft-sql-server/designing-performance-null-or-not-null

答案 2 :(得分:0)

询问问题:

  

“ NULL与NOT NULL性能差异”

,答案必须基于行的存储结构以及在出现Null的情况下行的处理差异。

答案是:没有区别。

以下是讨论SQL Server中行结构的文章: https://www.red-gate.com/simple-talk/sql/database-administration/sql-server-storage-internals-101/ https://aboutsqlserver.com/2013/10/15/sql-server-storage-engine-data-pages-and-data-rows/

此处列定义为CHAR(1),因此它是固定大小的列。 在行结构信息中检查空字符串'''和Null之间的差异。没有结构空间节省来存储null或空字符串。结构信息不会根据约束的定义而改变。

如果您要在数据结构关系中寻找性能,那么您需要在其他地方寻找。

恕我直言: 定义为CHAR(1)的列通常包含具有很少不同值的编码信息。 通常,此类列通过FK指向“翻译”表。 因此,如果它是“ 2-状态指示符值”,则可以使用BIT类型,只要知道该类型的所有列都分组在同一字节中即可。 如果需要更多不同的情况(更多不同的值),那么tinyint类型也将占据固定大小的1个字节,但是不需要验证排序规则来处理关系。 (注意:TinyInt提供的值比CHAR(1)还要多)

在其他地方,如果您还没有FK约束,则必须保持平衡。

答案 3 :(得分:-1)

 [FooColumn] CHAR (1) DEFAULT ('N') NOT NULL,

它远比NCHAR(1),VARCHAR(1)或NVARCHAR(1)好! (对于MySQL,请检查FooColumn CHARACTER SET)

但是,取决于您的RDBM和现有的开发情况,调查是否可以使用BIT或TinyInt(无排序规则)

与“无”相比,检查“无空”所需测试的额外成本非常非常小。