最近我在查看我们的SQL表时发现了以下情况。
[FooColumn] CHAR (1) DEFAULT ('N') NOT NULL,
您可以看到,FooColumn始终默认为'N',但仍指定了“NOT NULL”。
将列设置为“NOT NULL”而不是“NULL”,是否会有一些存储/性能差异?
SQL Server如何处理“NOT NULL”和“NULL”列之间的区别?
注意:这仅适用于SQL,而不涉及外部执行NULL检查的开销。
最近我在查看我们的SQL表时发现了以下情况。
[FooColumn] CHAR (1) DEFAULT ('N') NOT NULL,
您可以看到,FooColumn始终默认为'N',但仍指定了“NOT NULL”。
将列设置为“NOT NULL”而不是“NULL”,是否会有一些存储/性能差异?
SQL Server如何处理“NOT NULL”和“NULL”列之间的区别?
注意:这仅适用于SQL,而不涉及外部执行NULL检查的开销。
这是一个复杂的“辩论”。
NULL表示未知。与0或空字符串不同。
NOT NULL表示您需要在其中插入一个值,即使它是空字符串或0也是如此。许多设计师认为这是更好的设计。其他人认为使用NULL值没有问题。不同的软件公司将强制执行不同的规则。
具有“默认”值意味着当您创建新记录而没有指定值时,它将使用默认值。无论字段是否为NULL或NOT NULL。
具有NULL值可能会对性能产生影响(因为DBMS需要处理这种特殊情况),这将取决于您使用的DBMS,版本,配置等...您需要使用自己的设置进行基准测试以了解情况。
这是一篇好文章:http://www.itprotoday.com/microsoft-sql-server/designing-performance-null-or-not-null
在我看来:
定义为CHAR(1)
的列通常包含具有少量不同值的编码信息。
这种列通常通过FK指向“翻译”表。
因此,如果它是“2状态指示器值”,则可以使用BIT类型,知道所有此类型的列都分组在同一个字节中。
如果需要更多不同情况(更多不同的值),则tinyint类型也将占用1个固定大小的字节,但不需要验证排序以处理关系。(注意:TinyInt比CHAR(1)
提供更多的值)
另外,如果您还没有FK约束,则必须平衡考虑。
[FooColumn] CHAR (1) DEFAULT ('N') NOT NULL,
它比NCHAR(1), VARCHAR(1)或NVARCHAR(1)要好得多! (对于MySQL,请检查FooColumn CHARACTER SET)
但是,根据您的RDBMs和现有开发情况,调查是否可以使用BIT或TinyInt(无排序规则)
与“NULL”相比,需要检查“NOT NULL”的额外成本非常非常小。
INSERT INTO Table (foo) VALUES (null);
。与空值工作可能非常麻烦。空引用的发明者称其为“十亿美元的错误”(参考链接)。 - David RushtonNULL
只与空引用共享一个名称,它们并不是同一回事。 - Damien_The_Unbeliever