1

据我了解,应尽可能避免数据库中的可空列。

但是,在哪些特定情况下,可空列实际上会导致性能显着下降?

换句话说,什么时候 null 真的会损害性能?(与它可以忽略不计,根本不重要的时候相反)。

我在问,所以我可以知道它何时以及如何真正产生影响。

4

1 回答 1

4

不知道你在哪里听到的,但这不是真的。

可空列用于准确表示数据:如果值未知或尚未输入,则 NULL 是存储的自然值。Null 值的存储或检索并不比任何其他类型的值更繁琐:大多数数据库服务器将它们存储在一个位中,这意味着检索 NULL 值比组装 varchar 需要更少的 I/O 和处理器工作, BLOB,或来自一堆片段的文本字段,可能需要遍历链表,或从硬盘驱动器读取更多磁盘块。

有几个与可空列相关的实例可能会影响性能:

  1. 如果您在可为空的列上创建索引,并且该列中的实际值是稀疏的(即许多行具有 NULL 值,或者仅存在很少的值(例如,受控词汇值),则 b用于索引列的树数据结构变得效率低得多。当索引中一半的值相同时,索引遍历变得更加昂贵:你最终得到一个不平衡的树。

  2. 不恰当地使用 NULL 值,或者在设计时不使用 NULL 值的不适当查询技术通常会导致性能下降,因为程序员经常回到搜索或连接计算列值的坏习惯,这会忽略奇妙的集合-现代数据库服务器的处理能力。我在很多地方咨询过开发人员习惯于写条款的地方,比如:

    WHERE ISNULL(myColumn, '') = ''

这意味着数据库服务器不能直接使用索引,并且必须对执行树的该部分的每一行执行计算以评估查询。这并不是因为在存储、比较或评估 NULL 值方面存在任何内在的低效率,而是因为查询阻碍了数据库引擎实现特定结果的能力。

于 2013-08-02T01:21:45.927 回答