2008-12-01 79 views
8

我有一個請求,允許動態表格有1000列(由我的最終用戶隨機選擇)。這對我來說似乎是個壞主意。這是一個可定製的表格,因此它將有varchar(200)float列(float最匹配應用程序C++ double類型)的混合。該數據庫主要是遺留應用程序的索引,並充當報告存儲庫。這不是記錄系統。該應用程序有數千個數據點,其中很少可以被標準化。SQL Server 2005表有多少列太多?

關於這是什麼性能影響的任何想法?還是一個理想的表格大小來分割這個呢?

由於我不知道20k價值選擇中的哪些領域,最終用戶將選擇規範化表是不可行的。我可以將這些數據分離到多個表中,我必須動態管理(可以添加或刪除字段,然後刪除行並重新解析記錄系統以填充表)。我的偏好是推回規範化所有20k位的數據。但我沒有看到發生。

回答

15

這聞起來像一個不好的設計給我。

需要考慮的事情:

將最這些列的是包含NULL值?

許多人會被命名爲Property001,Property002,Property003等......?

如果是這樣,我建議你重新考慮你的數據規範化。

+1

這些列將與應用程序中的數據點相關。如果用戶對該字段進行了廣告宣傳,我認爲這些值通常不會爲空。 – 2008-12-01 17:15:12

+0

「如果用戶添加了字段」,則表示該字段在其他情況下爲空。這個字段列表是動態的嗎?你會添加列來支持添加字段嗎?然後一對多的關係是爲了。 – 2009-09-25 21:22:37

4

作爲一項規則:表越寬,表現越慢。許多薄桌子比桌子上的一塊肥皂更好。

如果你的桌子很寬,那幾乎肯定是一個設計問題。關於有多少人更可取,沒有真正的規則,我從來沒有真正遇到過現實世界中具有20列以上的桌子。按關係分組。畢竟這是一個RDBMS。

+2

「表越寬表現越慢」不,這不是一般規則,它取決於查詢的性質。非規範化通常用於提高某些類型的查詢的性能。 – bradw2k 2015-04-06 18:04:09

0

似乎非常多。我首先要確保數據正常化。這可能是你的問題的一部分。這些數據的用途是什麼?是否需要報告?數據會改變嗎?

我會認爲一張桌子,這將是一個噩夢的表現和維修明智。

+0

我從csv文件導入數據時看到了這個。 CSV每天從一個傳統系統進來,並且有8-900列,只是將它推到一張桌子上更快。 – StingyJack 2008-12-01 16:38:37

+0

如果表只用作臨時存儲空間,並立即轉換爲更適合的形式,那麼我不認爲OP會問這個問題... – rmeador 2008-12-01 17:05:39

1

太多了。超過50列的寬度,在出現問題時,您需要在性能,代碼維護和故障排除方面遇到麻煩。

14

從SQL2005文檔:

的SQL Server 2005可以爲每個數據庫最多兩個十億表,每個表1024列。 (...)每行的最大字節數是8,060。對於使用varchar,nvarchar,varbinary或sql_variant列的表,可以放寬此限制,從而導致總定義的表寬度超過8,060個字節。這些列中的每一列的長度必須仍在8,000字節的限制範圍內,但它們的組合寬度可能會超過表中的8,060字節限制。

這些列的功能是什麼?爲什麼不更好地將它們拆分爲主表,屬性(查找表)和值?

6

MS SQL Server對每個表有1024列的限制,所以你將會在這個邊緣上運行。使用varchar(200)列,您將能夠超過每行8k字節的限制,因爲SQL將在數據頁面上存儲8k,然後溢出頁面外的數據。

SQL 2008爲這樣的場景添加了稀疏列 - 在這裏你會有很多列中有空值的列。

使用稀疏列 http://msdn.microsoft.com/en-us/library/cc280604.aspx

+0

Sparse Columns在這裏是個不錯的選擇如果你可以使用SQL 2008.還可以看看Colum Sets的使用與它有關http://msdn.microsoft.com/en-us/library/cc280521.aspx – kristof 2008-12-01 17:31:31

+0

這裏是一個簡單的例子,使用稀疏列和列集http://www.sqlskills.com/blogs/paul/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx – kristof 2008-12-01 17:34:46

4

這將會產生巨大的性能和數據問題。它可能需要正常化。

雖然SQl服務器將允許您創建一個超過8060字節的inteh行的表,但它不會讓您存儲比它更多的數據。你可能會意外地截斷數據(甚至更糟糕的是,直到幾個月後才發生這種情況,在這段時間修復這個怪物是既緊迫又極其困難)。

查詢這也將是一個真正的問題。你如何知道1000列中的哪一列查找數據?是否每個查詢都要求where子句中的所有1000個列?

而這將是用戶可定製的想法確實是可怕的。爲什麼用戶需要1000個字段來定製?我見過的大多數應用程序都讓用戶有機會定製一些字段,設置一個小限制(通常小於10)。如果他們需要進行定製,那麼應用程序在定義客戶實際需求方面做得並不好。

有時候作爲開發者,你只能站起來說不,這是一個壞主意。這是其中的一次。至於你應該做什麼(而不是正常化),我認爲我們需要更多的信息來指引你朝着正確的方向。

而BTW,float是一個不精確的數據類型,不應該用於計算髮生的字段,除非你喜歡不正確的結果。

9

無論何時您覺得需要詢問系統有什麼限制,您都有設計問題。

如果您問「我可以裝入varchar的字符數量是多少?」那麼你就不應該使用varchars了。

如果你真的想知道1000列是否可以,那麼你迫切需要重新組織數據。 (規範化)

0

您是否想過查看最終(1000列)表作爲交叉表查詢的結果?您的原始表格將只有幾列但有數千條記錄。

您能否詳細說明您的問題?我認爲沒有人真正明白你爲什麼需要這1000列!

2

我不得不不同意這裏的每個人......我知道這聽起來很瘋狂,但使用帶有數百列的表格是我做過的最棒的事情。

是的許多列經常有空值; 是的,我可以正常化它只是幾個表和轉置; 是的,它是低效

但是這是令人難以置信的速度快,易於分析無盡不同的方式列數據

浪費和不雅 - 你將永遠不會建造任何東西是有用的!