2011-04-17 42 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的第一張桌子應該滿足你的好奇心。

相關問題