2011-04-17 86 views
0

数据库在实现方式上有所不同,以及它们如何处理数据的查询和存储。什么影响在数据库中null?

具有空值属性是否会消耗存储空间?

具有空值属性是否会影响查询数据的速度?如果数据存在或不存在,基本上查询会更快或更慢。注意。我不问如何加快查询数据。

所以我的问题是一个普遍的问题,但可以自由地回答特定的数据库实现,如sql server或sqlite。

回答

2

在我知道的数据库中,NULL 不会消耗比非NULL更多的空间,它仍然必须允许最大大小。但是,列可以为NULLable的事实可能会消耗额外的存储空间。

这是因为,除了可能的值之外,您还必须存储列为NULL或不是每行的事实。不过,这在存储方面非常高效。

对于可NULLable列,查询所花费的额外时间最多不超过。

你不应该在意是否需要更多时间。数据库的设计是由数据的需求驱动的,而不是运行速度。我并不是说你应该完全忽略性能,但是,如果你的列需要存储空值,那么它需要,无论性能如何。

+1

实际上,通常可以通过引入更多表来避免NULL列。相反,您可以通过允许NULL列来消除表格。这通常被认为是为了性能和/或简化查询而完成的非规范化形式。 (日期的[第一范式](http://en.wikipedia.org/wiki/First_normal_form)不允许NULL值。) – 2011-04-17 09:53:30

+0

我同意泰德:事实上你很少需要**来存储空值。比照http://missingdata.wordpress.com/2007/07/26/the-final-null-in-the-coffin/ – Peter 2011-04-17 12:04:45

1

是的,NULL的确占用了存储空间。通常该字段使用一位来存储NULL状态,因此表中的所有行均使用此额外位,而不管它们是否为NULL。这是区分NULL和其他值(例如,在NULL和0之间)的唯一方法。

如果这是您所关心的问题,请确保在不需要额外功能的情况下将字段标记为NOT NULL。

2

关于磁盘空间,以下内容适用于SQL Server(可能但不确定,可能适用于其他引擎)。

固定大小数据类型将NULL值存储为默认数据类型大小:数字为0,字符为''。假设你有一个CHAR(5)列:用NULL值填写5个字节。

可变大小的数据类型存储空值的NULL值。假设你有一个VARCHAR(10)列:用NULL值填充0字节。

关于查询,对于所有依赖查询的数据库。对于一些命令进行比较,对于其他一些命令。这个SQLite page的第一张桌子应该满足你的好奇心。

相关问题