2012-03-23 110 views
1

當我在列中使用SQL Server TextVarchar(max)數據類型時,它會創建數據庫過大:例如1000行包含varchar(max)使用大約1000 Mb(1Gb)!!!!SQL Server文本數據類型或Varchar(max)會創建數據庫太大

這是正常的嗎?

感謝您的幫助

編輯我的文本字段大約5至最大50 KB

+2

佔據你確定它是'varchar'而不是'char'? – 2012-03-23 10:53:14

+1

這取決於每個記錄有多少。如果每個數據平均包含1MB數據,那麼其中1000個將佔用1GB。 – 2012-03-23 10:54:43

+0

我想你是問連續4個解釋點是否正常......不是。 (另外,使用varchar而不是char或text) – Hogan 2012-03-23 11:08:50

回答

1

這取決於你的桌子裏面有什麼。 如果你有1000行具有1MB的數據,你將有1000 MB

嘗試運行:

select datalength(yourField) from yourTable 

數據長度功能會給你多少字節由列

+1

謝謝這真的幫助我,我試圖通過recod檢查記錄,以檢查是否真的抓住我看到的是真正抓住我發送的數據 – 2012-03-23 13:59:29

+0

查看此鏈接以獲取更多參考:http:// msdn.microsoft.com/en-us/library/ms173486.aspx 如果我的回答helepd你,記得投票和標記爲答案 – Diego 2012-03-23 14:04:02

+0

我不能投票,因爲我在這裏是新的。但是非常感謝 – 2012-03-23 14:18:43

0

運行sys.sp_spaceused @objname = N'YourTable';查看您桌子使用的空間。

如果沒有未使用的空間,那麼你的數據確實佔用該空間

如果有大量的未使用的空間,你可以嘗試創建一個新的文件組和移動文本/爲varchar(最大值)列到這個新的文件組,並縮小數據庫DBCC SHRINKDB

之後,您的主文件組將佔用較少的空間,並且您可以使用DBCC SHRINKFILE收縮「違規」文件,每當問題出現時。

創建一個新的文件組可以通過SSMS在數據庫屬性,文件頁面中完成。您可以從那裏生成sql腳本以查看發生了什麼。

將文本列移動到不同的文件組可以通過使用TEXTIMAGE_ON {filegroup | 「default」}在CREATE TABLE

對不起:沒有alter table可能,沒有單個列到不同的文件組,但是所有的「大」列一次。所以你必須手工完成或者在一個新的數據庫圖表(在SSMS工作室中)中顯示你的表格並更改屬性......對不起,我不知道它的名字,就像「文本/圖像文件組」(我想,我有西班牙語SSMS),但是當你在數據庫圖表設計器中看到表格屬性時,它就在那裏。

優點:減少主表上的碎片,更快的表格/聚簇索引,以及只收縮您感興趣的文件的可能性:帶有問題的「大」列。

+0

是的,桌子正在佔據那個地方。 你是什麼意思的文件組?你能解釋做什麼? 感謝您的幫助 – 2012-03-23 13:28:47

+0

我編輯了我的答案,表明您必須這樣做。 – JotaBe 2012-03-23 14:28:55

0

varchar(max)與varchr(n)不同;

varchar(max)單元格可以包含2 GB的數據。

但是對於varchar(n):n的最大數量是8000,意味着最大8 KB數據。

但是,無論如何,我不知道你在數據庫中存儲了什麼樣的數據。

所以,總之,可能正常

+0

看看他的評論:每行4到50kb的文本...應該不會加起來1Gb。 – JotaBe 2012-03-23 12:27:16

+0

@JotaBe奇怪。如果每行50KB,1000行應該是50MB。所以也許一些行有更大的數據 – 2012-03-29 11:48:33