2016-08-09 64 views
0

好的,所以我一直在研究一個項目,我需要創建一個sql'寬表'或一個可以處理超過+1000列數據的sql表。要建立一個例子,讓我們說,出1502列在一排:SQL - 稀疏表,總大小和單元格空間

  • 1列專用於「ID INT PRIMARY KEY」
  • 5列使用專用於文件信息「FileInfo_1 VARCHAR(20)稀疏,...「
  • 1495列是專爲使用帶有小數存儲號碼‘number_info_1 實稀疏,...’
  • 最後一列包含使用列集信息」 columnSet XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

當我在我的

INSERT Test_table(ID, FileInfo_1, FileInfo_2, ...) VALUE(0, 'string1', 'string2', ..., 0.1234, 1.2345, ...)

SQL運行測試字符串我碰上問題的行最大空間量超出了8060字節限制。但是,鑑於我有什麼,不應該總空間低於8060?由於int需要4個字節,所以5個varchar(20)單元應該佔用100個字節(或者10個字節,我不太確定),而1495個實際單元應該佔用5980個字節,全部小於8060.

我做了一些測試,每個實際單元使用了多少數據,對於每個刪除的實際單元,我都返回了8個字節。這對我來說沒有意義,因爲它應該只有4個字節,是正確的?

任何人都可以提供一些見解,爲什麼發生這種情況?我是新來的,我不確定爲什麼真正的單元格需要8個字節,而不是4個。

+1

MySQL和SQL Server是不同的產品。稀疏列是一個你問關於MySQL或SQL Server? –

+0

我要求一個SQL Server,一個Windows Server 2008 R2標準是特定的,在本地機器上運行。 – MMan

+0

當你*不打算填滿它們時,稀疏列是有意義的。如果您只存儲每次100個實際值,則可以有數千個列。這些值存儲在columnset字段中,該字段佔用的空間比各個列所需的空間要多。如果爲每行填充大量列,則稀疏列不起作用。 –

回答

0

非空稀疏列值實際上是更多空間比非稀疏值。當您想要存儲大多數時間爲空的很多列時,稀疏列很有用。

從文檔Use Sparse Columns文章顯示real值佔用8個字節時,非空閒列只需要4個字節。如果每次填充所有這些數據,則需要11960個字節。

該文章顯示每個類型必須有多少個空值才能實現40%的空間減少。在你的情況下,你需要約590個實數列爲空。

如果您需要爲每行填充所有1495個值,則應該垂直分區表。

如果您不需要訪問SQL中的單個值,則可以選擇將所有數據存儲在blob字段中,例如varbinary(max)nvarchar(max)字段。在這種情況下,只有消費應用程序才能夠使用這些數據。這也阻止你使用這些值的任何索引

+0

非常感謝您的幫助 – MMan