(圖1:數(shù)據(jù)列表)你看到這些數(shù)據(jù),是不是覺得這樣的設(shè)計(jì)既浪費(fèi)了存儲 " /> 亚洲一区二区在线成人,日本三级香港三级妇三,欧美乱人伦中文在线观看不卡

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

SQL Server datetime數(shù)據(jù)類型設(shè)計(jì)、優(yōu)化誤區(qū)

  一、場景 

SQL Server 2005中,有一個(gè)表TestDatetime,其中Dates這個(gè)字段的數(shù)據(jù)類型是datetime,如果你看到表的記錄如下圖所示,你最先想到的是什么呢?


(圖1:數(shù)據(jù)列表)

你看到這些數(shù)據(jù),是不是覺得這樣的設(shè)計(jì)既浪費(fèi)了存儲空間,又使得這個(gè)列的索引增大,查詢起來更慢,你也想使用一些其它的數(shù)據(jù)類型來代替這個(gè)datetime吧?

       其實(shí)大家都是這么想的,這個(gè)方向是100%正確的,但是在寫這篇文章以前,我進(jìn)入了兩個(gè)誤區(qū):(如果你中了下面的兩個(gè)誤區(qū),那么請你看看這篇文章吧。)

誤區(qū)一:Dates字段的datetime數(shù)據(jù)類型換成smalldatetime,這樣數(shù)據(jù)就由:‘2009-04-0900:00:00.000’變?yōu)?lsquo;2009-04-09 00:00:00’,這個(gè)看起來沒有減少多少存儲空間哦。

誤區(qū)二:Dates字段的datetime數(shù)據(jù)類型換成char(10),這樣數(shù)據(jù)就由:‘2009-04-09 00:00:00.000’變?yōu)?lsquo;2009-04-09’,這好像能減少很多存儲空間哦。

  二、分析

SQL Server 2005版本中保存日期的數(shù)據(jù)類型只有兩種:datetime、smalldatetime,但是在SQL Server 2008版本中新增了一些日期數(shù)據(jù)類型:time、date、smalldatetimedatetime、datetime2、datetimeoffset,其中的date類型就能滿足我們場景中的需求了,如果你幸運(yùn)的在使用SQL Server 2008的話,那么恭喜你,請使用date數(shù)據(jù)類型吧。

       但是我就比較可悲一點(diǎn)了,在使用SQL Server 2005的前提下,我進(jìn)入了誤區(qū)一、誤區(qū)二。其實(shí)這也是因?yàn)樽约汉雎粤艘幌禄A(chǔ)性的東西,如果知道不同數(shù)據(jù)類型的存儲空間大小,也許就很輕易的避免這樣低級的錯(cuò)誤了。

其實(shí)你查看表TestDatetime中的Dates字段的時(shí)候,看到查詢結(jié)果中的:“-”、“:”只是用于顯示的,并不是真實(shí)保存的時(shí)候就這樣格式的。

datetime占用8個(gè)字節(jié),前4個(gè)字節(jié)存儲basedate(即190011日)之前或之后的天數(shù),后4個(gè)字節(jié)存儲午夜后的毫秒數(shù)。值范圍:1753-01-01 9999-12-31。

smalldatetime占用4個(gè)字節(jié),前2個(gè)字節(jié)存儲base date190011日)之后的天數(shù)。后2個(gè)字節(jié)存儲午夜后的分鐘數(shù)。值范圍:1900-01-01 2079-06-06。

date占用3個(gè)字節(jié),它比smalldatetime的前2個(gè)字節(jié)多了1字節(jié),所以值的范圍更廣了。值范圍:0001-01-01 9999-12-31。

       所以,如果你使用char(10)來保存截?cái)嗟娜掌?,那么你?a href=/pingce/cunchu/ target=_blank class=infotextkey>存儲空間反而更大了。

結(jié)論: 如果是SQL Server 2005,那么請你使用smalldatetime吧,數(shù)據(jù)能節(jié)約一半,雖然查詢的時(shí)候看起來沒什么改變;如果你是SQLServer 2008,那么請你使用date吧,

  雖然3個(gè)字節(jié)跟4個(gè)字節(jié)沒有多大的差距,但是從設(shè)計(jì)上和邏輯清晰度上都有很大的提升,而且差距有些時(shí)候并不是1個(gè)字節(jié)的問題,比如當(dāng)表數(shù)據(jù)量達(dá)到幾個(gè)億的時(shí)候,還是有差別的,又或者一條記錄可能因?yàn)椴?span lang="EN-US">1個(gè)字節(jié)就剛剛好給8060字節(jié)的頁瓜分,這些都不容忽視的。

  三、測試

下面我們就從數(shù)據(jù)存儲的大小、索引存儲的大小、索引使用時(shí)候的速度這幾個(gè)方面進(jìn)行測試:(這里只測試數(shù)據(jù)類型:,,數(shù)據(jù)的內(nèi)容都是一樣的)

  (一)  測試前奏:

1.      創(chuàng)建三種數(shù)據(jù)類型char(10)、datetimesmalldatetime的表;(表結(jié)構(gòu)如下面SQL

CREATE TABLE[dbo].[TestDatetime](

    [Id] [int] IDENTITY(1,1) NOT NULL,

    [Dates] [datetime] NULL,

 CONSTRAINT[PK_TestDatetime] PRIMARY KEY CLUSTERED

(

    [Id] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON[PRIMARY]

2.      插入相同記錄到三個(gè)表中;(這里插入1210000條記錄)

3.      [Dates]字段創(chuàng)建索引;(在創(chuàng)建索引的時(shí)候可以設(shè)置填充因子為100%

4.      查看索引屬性中的索引碎片信息,查看表數(shù)據(jù)和索引占用的空間,測試[Dates]字段索引的查詢效率;

  (二)  測試結(jié)果:

1.      數(shù)據(jù)存儲大小:


(圖2數(shù)據(jù)空間對比

2.      索引存儲信息:


(圖3char(10)


(圖4datetime


(圖5smalldatetime

3.      索引查詢的情況:

多次執(zhí)行,SQL Server執(zhí)行時(shí)間為:[char(10)] 大部分在43~59徘徊,偶爾出現(xiàn)小于10的;[datetime]平均在1~2毫秒;[smalldatetime]均在1毫秒;而且大家會發(fā)現(xiàn)[smalldatetime]有其它的9次邏輯讀取變?yōu)?span lang="EN-US">8次了。

 

--[TestChar10]

SQL Server 分析和編譯時(shí)間:

  CPU 時(shí)間=0 毫秒,占用時(shí)間=1 毫秒。

 

(2200 行受影響)

'TestChar10'。掃描計(jì)數(shù)1,邏輯讀取9次,物理讀取0次,預(yù)讀0次,lob邏輯讀取0次,lob物理讀取0次,lob預(yù)讀0次。

 

SQL Server 執(zhí)行時(shí)間:

  CPU 時(shí)間=0 毫秒,占用時(shí)間=59 毫秒。

 

SQL Server 執(zhí)行時(shí)間:

   CPU 時(shí)間=0 毫秒,占用時(shí)間=1 毫秒。

 

--[TestDatetime]

SQL Server 分析和編譯時(shí)間:

  CPU 時(shí)間=0 毫秒,占用時(shí)間=1 毫秒。

 

(2200 行受影響)

'TestDatetime'。掃描計(jì)數(shù)1,邏輯讀取9次,物理讀取0次,預(yù)讀0次,lob邏輯讀取0次,lob物理讀取0次,lob預(yù)讀0次。

 

SQL Server 執(zhí)行時(shí)間:

  CPU 時(shí)間=0 毫秒,占用時(shí)間=2 毫秒。

 

SQL Server 執(zhí)行時(shí)間:

   CPU 時(shí)間=0 毫秒,占用時(shí)間=1 毫秒。

 

--[TestSmalldatetime]

SQL Server 分析和編譯時(shí)間:

  CPU 時(shí)間=0 毫秒,占用時(shí)間=1 毫秒。

 

(2200 行受影響)

'TestSmalldatetime'。掃描計(jì)數(shù)1,邏輯讀取8次,物理讀取0次,預(yù)讀0次,lob邏輯讀取0次,lob物理讀取0次,lob預(yù)讀0次。

 

SQL Server 執(zhí)行時(shí)間:

  CPU 時(shí)間=0 毫秒,占用時(shí)間=1 毫秒。

 

SQL Server 執(zhí)行時(shí)間:

   CPU 時(shí)間=0 毫秒,占用時(shí)間=1 毫秒。

 

--SQL Server 2008新數(shù)據(jù)類型

SELECT

CAST('2007-05-08 12:35:29. 1234567+12:15' AS time(7)) AS 'time'

,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'

,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS

'smalldatetime'

,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'

,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 'datetime2'

,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 'datetimeoffset';

  四、參考文獻(xiàn)

  日期和時(shí)間數(shù)據(jù)類型及函數(shù)(Transact-SQL)

  LEN (Transact-SQL)

  DATALENGTH (Transact-SQL)

  smalldatetime和datetime存儲

 

it知識庫SQL Server datetime數(shù)據(jù)類型設(shè)計(jì)、優(yōu)化誤區(qū),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲尹人香蕉网在线视颅 | 日本一区二区视频 | 欧美亚洲激情视频 | 在线观看视频一区二区三区 | 久久婷婷国产精品香蕉 | se视频在线观看 | 一区二区三区中文国产亚洲 | 激情图片激情小说激情视频 | 久久久综合中文字幕久久 | 国产在线视频第一页 | 在线观看视频www在线观看 | 狠狠香蕉| 2021久久精品国产99国产精品 | 欧美综合图片 | 一二三四视频社区在线中文1 | 欧美色婷婷 | 日韩免费视频一区 | 最新亚洲情黄在线网站 | 色版视频在线观看 | 网站久久| 日韩欧美区 | 色中文在线 | 婷婷综合激情五月中文字幕 | 91中文字幕yellow字幕网 | 日日夜夜2017| 黄色小视频在线免费观看 | 精品精拍国产日韩26u | 亚洲性影院 | 日韩亚洲欧美综合一区二区三区 | 亚洲丝袜中文字幕 | 亚洲第一影院 | 美女网站一区二区三区 | 丁香六月综合网 | 欧美亚洲综合视频 | 日本一区二区三区在线 视频 | 视频久久 | 四虎免费视频 | 草草线在成人免费视频 | 天干天干夜天干天天爽 | 天天视频入口 | 国产美女在线播放 |