小编典典

可空与非空varchar数据类型-查询哪种更快?

sql

通常,我们希望所有varchar/nvarchar列都 不能为空, 并使用空字符串(’‘)作为默认值。团队中的某人建议 nullable
更好,因为:

这样的查询:

Select * From MyTable Where MyColumn IS NOT NULL

比这更快:

Select * From MyTable Where MyColumn == ''

任何人都具有验证这种说法是否正确的经验吗?


阅读 205

收藏
2021-04-22

共1个答案

小编典典

在某些平台(甚至版本)上,这将取决于对NULL进行索引的方式。

我对NULL的基本经验法则是:

  1. 除非有正当理由,否则不允许NULL

  2. 除非数据确实未知,否则不允许NULL

一个很好的例子是对地址线进行建模。如果您有一个AddressLine1和AddressLine2,那么第一个具有数据,第二个为NULL意味着什么?在我看来,您要么知道地址,要么不知道地址,并且在数据集中有部分NULL的情况只是在有人将它们串联并获得NULL时才提出麻烦(ANSI行为)。您可以通过允许NULL并添加检查约束来解决此问题-
所有地址信息都为NULL或全都不为。

中间名字首字母/名称类似。有些人没有。这与未知是不同的吗?您在乎吗?

另外,死亡日期-NULL是什么意思?没死?未知的死亡日期?很多时候,单列不足以对领域中的知识进行编码。

因此对我来说,是否允许NULL很大程度上取决于数据的 语义 -性能将排在第二位,因为错误地解释数据(可能被许多不同的人)通常比性能昂贵得多。

看起来似乎有点小事(在SQL
Server中,实现是与行一起存储的位掩码),但在我看来,只允许在对齐后使用NULL似乎效果最好。它在开发的早期就抓住了问题,迫使您应对假设并了解您的问题领域。

2021-04-22