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

2024-06-21

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

像这样的查询:

Select * From MyTable Where MyColumn IS NOT NULL

比这个更快:

Select * From MyTable Where MyColumn == ''

有谁有经验来验证这是否属实?


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

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

  1. 在合理之前不允许 NULL

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

一个很好的例子是对地址线进行建模。如果有AddressLine1和AddressLine2,第一个有数据而第二个为NULL意味着什么?在我看来,你要么知道地址,要么不知道,当有人将它们连接起来并得到 NULL(ANSI 行为)时,一组数据中包含部分 NULL 只会带来麻烦。您可以通过允许 NULL 并添加检查约束来解决此问题 - 所有地址信息都为 NULL 或没有。

与中间名首字母/名字类似。有些人没有。这与未知有什么不同吗?你关心吗?

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

所以对我来说,是否允许 NULL 在很大程度上取决于语义首先是数据 - 性能将是第二位,因为数据被误解(可能被许多不同的人)通常是一个比性能更昂贵的问题。

这看起来可能是一件小事(在 SQL Server 中,实现是与行一起存储的位掩码),但在我看来,在合理化之后只允许 NULL 效果最好。它在开发早期就捕获了问题,迫使您解决假设并理解您的问题领域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可空数据类型与非空 varchar 数据类型 - 哪个查询速度更快? 的相关文章

  • 从sql server 2005中的列中获取查询的xml节点

    我有一个包含 2 列的表 第一个是带有主键的整数列 第二个是带有数据的 xml 列 数据列包含xml如下
  • SQL - 选择具有最大值的所有行

    我有这个 SQL 查询 SELECT id COUNT AS price FROM SELECT FROM rt WHERE somecondition AS st JOIN tt ON st id tt id GROUP BY id 现在
  • 仅当列不为 NULL 时才连接列

    我有一个像这样的 SQL Server 表 PERSON NAME PHONE PHONE1 PHONE2 PHONE CONCAT Name1 12345 Null Null Null
  • 在 SQLite GROUP BY 查询的 SELECT 列表中包含额外的列是否安全?

    我有一个简单的 SQLite 表 名为 message sequence INTEGER PRIMARY KEY type TEXT content TEXT 我想获取每种类型的最后一条消息的内容 由其序列确定 令我惊讶的是 以下简单查询有
  • 查找每个客户组的最新帐户

    我有一个包含客户信息的表 每个客户都会分配一个客户 ID 他们的 SSN 他们在开设更多帐户时会保留该 ID 两个客户可能使用同一个帐户 每个客户都有自己的 ID 帐号不按日期排序 我想找到每个客户或客户组的最新帐户 如果两个客户曾经一起使
  • 如何解决此错误:Py4JJavaError:调用 o70.showString 时出错?

    目前我正在开发 PySpark 和 DataFrame 我创建了一个数据框 from pyspark sql import import pandas as pd spark SparkSession builder appName Dat
  • 存储过程 EXEC 与 sp_executesql 的区别?

    我写了两个存储过程 其中一个是sp executesql而其他没有 sp executesql 两者都正确执行相同的结果 我不明白两者之间有什么区别 EXEC SQL 与 EXEC sp executesql SQL N eStatus v
  • 添加日期时间和时间

    服务器 SQL Server 2012 SP1 开发者版 Code declare datetime datetime 1900 01 01 00 00 00 000 declare time time 11 11 11 select da
  • Oracle 函数编译成功,但在执行 PLS-00221 时抛出错误:不是过程或未定义

    我有简单的oracle功能 create or replace function abs test func test in in number return number is test out number BEGIN test out
  • 在 SQL 中查询行序列

    假设我正在存储events有关联users如下表 其中dt代表事件的时间戳 dt user event 1 1 A 2 1 D 3 1 B 4 1 C 5 1 B 6 2 B 7 2 B 8 2 A 9 2 A 10 2 C 这样我们就可以
  • SQL Server到Mysql迁移(使用Mysql Workbench)数据传输错误

    我正在使用 Mysql Work bench 6 3 将数据库从 MS Sql server 2008 迁移到 Mysql 在 批量数据传输 期间出错并出现以下警告 这种情况仅发生在像 varchar char 这样的列类型上 当我尝试使用
  • 在两个以上的表上使用内联接删除查询

    我想使用两个以上表上的内联接从表中删除记录 假设我有表 A B C D 其中 A 的 pk 在所有其他提到的表中共享 然后如何编写删除查询以使用表 B 和 A 上的内联接从表 D 中删除记录 因为条件是从这两个表中获取的 我需要从 DB2
  • 在 JSP 中迭代列表对象

    我正在做一个项目来尝试自学 spring 和 struts 我目前卡在 JSP 页面上 我有一个 pojo 类 其中包含带有 getter setter 的变量 eid 和 ename 我还有一个 sql 中的表 其具有相同的值和六个填充行
  • 找出会话的默认 SQL Server 架构

    我需要知道正在执行某些 DDL 的 SQL 脚本中当前的默认架构是什么 我不需要设置架构 但我确实需要将对它的引用 名称或 ID 放入变量中 该脚本可能以 Windows 登录身份运行 因此以下内容还不够 SELECT name defau
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • 使用聚合函数时减少 Athena 扫描的数据量

    以下查询扫描 100 MB 的数据 select from table where column1 val and partition id 20190309 然而 下面的查询扫描了 15 GB 的数据 有超过 90 个分区 select
  • 使用 sql 查询选择最近 30 天

    我正在查找过去 30 天内周一 周二 周三 周四 周五 周六 周日的数量 我可以在没有实际数据库表的情况下选择最近 30 天的日期和星期几吗 就像是 SELECT everything between convert date GETDAT
  • SQL Server:比较两个表中的列

    我最近完成了从某些应用程序的旧版本到当前版本的迁移 在迁移数据库时遇到了一些问题 我需要一个可以帮助我比较两个表中的列的查询 我的意思不是行中的数据 我需要比较列本身来弄清楚我错过了表结构的哪些变化 看一下红门 SQL 比较 http ww
  • 简单的t-sql而不是触发器

    任何人都可以帮助解决简单的 t sql 脚本与板载触发器的问题吗 我使用非常简单的触发器将数据从一个表复制到另一个表 这些表之间没有关系 当我尝试在触发器创建后 从同一脚本 直接第一次插入数据时 我得到了所需的结果 但所有接下来的尝试都会失
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做

随机推荐