Nullable与非null varchar数据类型 - 查询速度更快?

Ran*_*der 9 sql

我们通常更喜欢使用空字符串('')作为默认值使所有varchar/ nvarchar不可为空.团队中有人建议可以为的更好,因为:

像这样的查询:

Select * From MyTable Where MyColumn IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

比这更快:

Select * From MyTable Where MyColumn == ''
Run Code Online (Sandbox Code Playgroud)

任何人都有经验来验证这是否属实?

Cad*_*oux 12

在某些平台(甚至是版本)上,这取决于NULL的索引方式.

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

  1. 在对齐之前不要允许NULL

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

一个很好的例子是建模地址线.如果你有一个AddressLine1和AddressLine2,那么第一个拥有数据而第二个是NULL是什么意思?在我看来,你要么知道地址与否,并且在一组数据中有部分NULL只是在某人连接它们并获得NULL(ANSI行为)时会遇到麻烦.您可以通过允许NULL并添加检查约束来解决此问题 - 所有地址信息都是NULL或者没有.

与初始/名字相似的东西.有些人没有.这有什么不同,它不知道,你在乎吗?

此外,死亡日期 - NULL是什么意思?没死?未知的死亡日期?很多时候,单个列不足以编码域中的知识.

所以对我来说,是否允许NULL将首先取决于数据的语义 - 性能将是第二,因为数据被错误解释(可能由许多不同的人)通常是比性能更昂贵的问题.

它可能看起来像一个小东西(在SQL Server中,实现是与行一起存储的位掩码),但在理由之后只允许NULL才能使我发挥最佳效果.它在开发早期捕获事物,迫使您解决假设并理解您的问题域.

  • @Mewp你不能算COUNT(DtOfDeath)的人,总有死人,你知道他们已经死了,但你不知道死亡的日期(或者它是可能的范围 - 正如我们从新的经验中所知道的那样卡特里娜飓风后的奥尔良).我的观点是,您必须考虑如何使用数据和您知道的内容才能成功建模问题域. (2认同)

Mew*_*ewp 5

如果您想知道没有值,请使用NULL.

至于速度,IS NULL应该更快,因为它不使用字符串比较.