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

标签 sql

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

这样的查询:

Select * From MyTable Where MyColumn IS NOT NULL

比这更快:
Select * From MyTable Where MyColumn == ''

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

最佳答案

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

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

  • 在合理的
  • 之前不允许使用NULL
  • 除非数据确实是未知的,否则不允许NULL

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

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

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

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

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

    关于sql - 可空与非空varchar数据类型-查询哪种更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3075958/

    相关文章:

    sql - 使用换行符将数据卸载到 s3 redshift

    sql - 如何知道异常插入查询是否成功?

    MySQL统计结果集的返回数量

    sql - 仅包括事件顺序有效的分组观察

    sql - 删除sql SELECT中的所有非数字字符

    sql - Oracle SQL : If I use a function both as a field and in order by, 是不是又求值了?

    mysql - 如何用用户名替换电子邮件?

    mysql - SQL - 如何执行这种类似连接的操作?

    mysql - SQL 从两个表中选择,如果 WHERE 子句为假,则获取列的空值

    sql - 列在多列唯一约束中的顺序有什么不同吗?有重复的索引是否合理?