數(shù)據(jù)類型在精度,范圍上有較大的差別。選擇合適的類型可以減少table和index的大小,進(jìn)而減少IO的開銷,提高效率。本文介紹基本的數(shù)值類型及其之間的細(xì)小差別。
最常用的數(shù)值類型是int,但是它未必是最佳選擇。bigint,smallint,tinyint可以應(yīng)用在特殊場合。他們的特性如下表所示:
可見如果某一列的值只有10來個(gè)值,而你卻用了int,那么沒行數(shù)據(jù)多占用了3個(gè)字節(jié)。如果有1G的行數(shù),那么你多用了3G的空間。如果它還在index中,ok,它又占用了不必要的3G。
與此類似的是Float和Real,他們的格式如下:
需要說明的是,float的長度取決于一個(gè)參數(shù),雖然我們通常聲明的時(shí)候并不指定float的長度,實(shí)際上是存在這樣的選項(xiàng)的。這個(gè)長度默認(rèn)是53,數(shù)值范圍如上表所示。
顯然如果你要表示的數(shù)字不會超過10的38次方的話,你應(yīng)該用real,他可以為你節(jié)省4個(gè)字節(jié)。
另一個(gè)相關(guān)的例子是decimal和numerical,他們是另一組精確表示數(shù)值的類型。float和real是不精確的,所以不能做相等的比較。
decimal和float在功能是等價(jià)的,為什么要分成兩個(gè)名字,我也不清楚。
decimal的聲明如下:decimal(p,s),p表示總共多少位,包括小數(shù)點(diǎn)前后的數(shù)字,s表示小數(shù)點(diǎn)后多少位,p不能超過38,當(dāng)然s不能超過p,缺省是0。
decimal的范圍是正負(fù)10的p-s次方的結(jié)果 減去10的-s次方。比如decimal(2,1)的范圍是正負(fù)9.9。
decimal的長度和p的大小相關(guān),如下表所示:
可使用變長字節(jié)來存放decimal。此時(shí)數(shù)據(jù)庫根據(jù)實(shí)際數(shù)值的大小來存放decimal,而不是根據(jù)聲明來判斷。如果表中沒有var length的列,那么需要額外的兩個(gè)字節(jié),否則不會有額外的需要。
可以通過如下的命令啟動(dòng)一個(gè)數(shù)據(jù)庫上的變長decimal存儲:
EXEC sp_db_vardecimal_storage_format ‘AdventureWorks’, ‘ON’ ;
通過EXEC sp_db_vardecimal_storage_format ;查看所有啟動(dòng)了這一功能的數(shù)據(jù)庫。
通過EXEC sp_tableoption ‘Sales.SalesOrderDetail’, ‘vardecimal storage format’, 1 ;
啟動(dòng)對某個(gè)表的變長decimal存儲。
最后再看看datetime和smalldatetime,兩者都表示時(shí)間,區(qū)別如下:
datetime表達(dá)的時(shí)間更久,1753到9999,精度更高,300分之一秒,占用8個(gè)字節(jié);
smalldatetime表達(dá)的時(shí)間較短,1900到2079,精確到分,4個(gè)字節(jié)。
通常情況下,smalldatetime是夠用的。