最近我正在查看我们的SQL表并注意到以下内容。
[FooColumn] CHAR (1) DEFAULT ('N') NOT NULL,
上面你可以看到FooColumn总是默认为' N'但仍然有一个" NOT NULL"指定。
将列设置为" NOT NULL"是否存在一些存储/性能差异?而不是" NULL" ?
SQL Server如何处理" NOT NULL:与" NULL"不同?专栏?
注意:这仅适用于SQL,而不是外部执行NULL检查的开销
答案 0 :(得分:4)
只有在有原因时才应使用NOT NULL(即UI或后端关系的必填字段)。 NOT NULL vs NULL性能可以忽略不计,根据this article from 2016 (SQL SERVER),在决定NOT NULL vs NULL时,性能不应该是一个考虑因素。
即使该字段默认为N'如果允许空值,命令仍然可以将其设置为NULL。归结为NULL是该列的有效数据。
修改强>
在数据驱动的技术应用程序中,根据我的经验,这些是我们使用的一些指导原则:
答案 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(无排序规则)
与“无”相比,检查“无空”所需测试的额外成本非常非常小。