原文:
設計表的時候,對變長字段長度選擇的一點思考
不管是在mssql還是mysql或者oracle,變長字段的長度衡量都是要經常面對的。
對於乙個變長的字段,在滿足業務的情況下(其實所謂的滿足業務是乙個比較模糊的東西),到底是選擇varchar(50)還是varchar(200)亦或是varchar(500)?
對於保守型選擇,往往是選擇乙個較大的長度,比如varchar(500)要比varchar(50)更具有相容性,因為是變長字段的原因,儲存空間也一樣。
這樣的選擇並不能說就不好,看站在哪個角度來看問題。
那麼,相對於varchar(50),varchar(500)在更具備相容性的同時,有哪些不好的地方,也是需要思考的,。
這裡的原則就是:對於可變長度的字段,在滿足條件的前提下,盡可能使用較短的變長字段長度。
以下是乙個相對極端的例子,以sql server為例,
testvarchar1和testvarchar2的sortcolumn 字段長度分別是varchar(50)和varchar(8000),兩個表寫入10000條測一樣的試資料,
sortcolumn 的實際長度是36個字元。
create1,基於儲存空間的考慮儲存空間上,儲存不超過一定長度的變長字段,不同長度的變長字段儲存空間是一樣的,比如選擇使用varchar(50)和varchar(500)是一樣的,table
testvarchar1
( id
intidentity(1,1
), sortcolumn
varchar(50))
create
table
testvarchar2
( id
intidentity(1,1
), sortcolumn
varchar(8000))
declare
@sortcolumn
char(36
);set
@sortcolumn
=cast(newid() as
char(36
))insert
into testvarchar1(sortcolumn) values (@sortcolumn
)insert
into testvarchar2(sortcolumn) values (@sortcolumn)go
10000
也就說,對於不超過50個字串的資料儲存,兩者在物理空間占用上並沒有區別。
這裡會發現,兩個表的資料在完全一致的情況下,其儲存空間也是完全一樣的,的確,並不會因為varchar使用乙個較長的長度而多占用儲存空間
2,基於效能的考慮
選擇varchar(50)還是varchar(8000),在效能上確實有顯著的差異,考慮到某些查詢需要記憶體(memory grant),查詢引擎會預估當前查詢需要的記憶體,影響查詢記憶體的因素有以下幾個方面
1,查詢的型別,有沒有聚合運算,有沒有排序等等
2,每個操作符涉及到的記錄數量
3,資料行的大小(這裡是字段型別的長度而不是字段實際長度)
當行記錄的資料型別長度較大的時候,執行計畫預估的平均大小較大,資料型別定義的長度越大,預估的長度越大,需要分配的記憶體越大
如果乙個查詢涉及一些聚合操作並且資料量較大,就可能需要大量的記憶體來完成這個查詢,查詢引起會分配多餘實際需要的記憶體。
兩者對資料行size的預估是一樣的(儘管是完全一樣的資料)
造成的結果就是兩個查詢的記憶體授予是一樣的,同時第二個執行計畫還有乙個警告資訊(黃色的感嘆號)
以上可以看出,儘管兩個表的資料是完全一致的,
不過欄位的最大長度不一致,造成執行計畫預估出現較大的偏差,因此給予較高的記憶體,浪費無所謂的資源。
再看乙個通過聚合函式操作兩張表的例子,會增加cpu的使用。
因此對於可變長度的字段,在滿足條件的前提下,盡可能使用較短的變長字段長度。
當然,較大的字段(相比較小)還可能存在一些不是太直觀的影響,參考:
設計表的時候,對變長字段長度選擇的一點思考
原文 設計表的時候,對變長字段長度選擇的一點思考 不管是在mssql還是mysql或者oracle,變長字段的長度衡量都是要經常面對的。對於乙個變長的字段,在滿足業務的情況下 其實所謂的滿足業務是乙個比較模糊的東西 到底是選擇varchar 50 還是varchar 200 亦或是varchar 5...
MyBatis更新欄位為null的一點思路
問題 在好多任務程裡,我們都習慣了使用if test null進行部分字段動態更新。但是如果我們遇到這種需要更新欄位為null的情況呢?大概方案想到了三種 去掉test條件。需要保證更新的實體都是從db中查出來的,否則會丟資料 使用特殊的值。比如 1等,這種含義有點模糊不清,並且可能以後隨著業務發展...
我對網頁設計的一點見解
我對網頁設計的一點見解 ryansoft 原作 關鍵字我對網頁設計的一點見解 出處首先說明一點,我不是專業的網頁設計人士,我是個程式設計師,不過接觸網頁已經有6年了,從一開始用html寫網頁到現在用dreamware來填網頁,多多少少也有半點見解吧.今天在藍色理想看到兩篇值得我收藏的文章,感覺真的不...