2011-09-14 85 views
4

如果您有一個包含12個空列和8個包含值列的20行的表,那麼對存儲和內存使用情況的影響是什麼?NULL值對SQL Server存儲的影響?

是否爲空值唯一或是每次存儲在同一位置的內存中並且只是被引用?大量空位佔用大量空間嗎?一張充滿空值的表是否佔用與int值相同大小的表相同的空間量?

這是用於Sql服務器。

+0

我不確定沒有什麼可以把價值作爲多少空間。 – BoltClock

+1

答案完全取決於實施。這可能是數據庫中依賴的數據類型。你對什麼數據庫感興趣? –

+1

@BoltClock - 在SQL Server中的一個固定長度的非稀疏列(沒有啓用壓縮)它有。 –

回答

7

這取決於數據庫引擎以及列類型。

至少SQLite的存儲每個空列作爲一個「空型」,它佔用了NO 附加空間(每個記錄是序列化到用於存儲的單個斑點所以用於非空值保留不空間在這種情況下)。通過像這樣的優化,NULL值的存儲開銷非常小。 (SQLite也對值0和1進行了優化 - 數據庫的設計者並沒有在玩耍!)有關詳細信息,請參見2.1 Record Format

現在,事情會變得更加複雜,特別是在更新和潛在索引碎片的情況下。例如,根據類型,在SQL Server空間中可以爲列數據保留。例如,一個int null仍然會保留整數的空間(並且在某處有一個「空」標誌),但varchar(100) null似乎沒有保留該空間(最後一位來自內存,因此需要警告!)。

快樂編碼。

+0

這正是我所說的。感謝您的答覆。 – joncodo

3

從SQL Server 2008開始,當您有一大堆空值時,您可以將列定義爲SPARSE。這將節省一些空間,但它需要列的一部分值爲空。究竟有多少取決於類型。

見數據類型的估計節省空間的文章Using Sparse Columns表,這將告訴你什麼百分比值必須爲null,根據表98%的40%

例如淨儲蓄的bit字段中的值必須爲空,以便節省40%,而只有43%的uniqueidentifier列會爲您提供相同的百分比。