空与非空 性能差异



最近我在看我们有一个SQL表,注意到了以下内容。

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

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

将列设置为"非空"而不是"空"是否会有一些存储/性能差异?

SQL Server 将如何处理"NOT NULL:不同于"NULL"列?

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

只有在有原因时才应使用 NOT NULL(即 UI 或后端关系的必填字段)。NOT NULL vs NULL 性能可以忽略不计,根据 2016 年的文章 (SQL SERVER),在决定 NOT NULL 与 NULL 时,性能不应成为考虑因素。

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

编辑

在数据驱动的技术应用程序中,根据我的经验,以下是我们使用的一些准则:

  • 对于数值字段,用户不知道 NULL,并且所有数字都有含义。
  • 对于字符串字段,NULL 和 " 与用户相同,因此这取决于您的后端应用程序。
  • 我知道您的问题是排除 ISNULL 检查,但如果您正在执行很多检查,那么如果可能的话,这些字段应该不是 NULL,因为它们可能会变得昂贵,这可能是一种代码气味。

这是一个复杂的"辩论"。

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

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

具有"默认"值仅意味着当您创建新记录而不指定值时,它将改用默认值。这与字段是 NULL 还是非 NULL 无关。

具有 NULL 值可能会影响性能(因为 DBMS 需要处理这种特殊情况),这将取决于您使用的 DBMS、版本、配置等......您需要使用自己的设置进行基准测试,以查看什么是什么。

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

正如问题被问到:

"空与非空性能差异">

,答案必须基于行的存储结构和在发生 Null 时行的处理差异。

答案是:没有区别。

以下是讨论 SQL 服务器中的行结构的文章: 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 约束,则必须对此进行平衡。

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

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

但是,根据你的RDBM和现有的开发,调查你是否可以使用BIT或TinyInt(没有排序规则)

与检查"NULL"所需的测试相比,检查"NULL"所需的测试的额外成本非常非常小。

相关内容

  • 没有找到相关文章

最新更新