自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

數(shù)據(jù)庫(kù) SQL Server
SQL Server datetime數(shù)據(jù)類(lèi)型設(shè)計(jì)以及數(shù)據(jù)庫(kù)優(yōu)化是SQL Server 數(shù)據(jù)庫(kù)操作過(guò)程中非常重要工作,但是在進(jìn)行SQL Server datetime數(shù)據(jù)類(lèi)型設(shè)計(jì)以及數(shù)據(jù)庫(kù)優(yōu)化時(shí)經(jīng)常會(huì)遇到一些問(wèn)題,這就會(huì)涉及到一些誤區(qū),下文中為大家總結(jié)出了經(jīng)常會(huì)遇到的,希望對(duì)大家能夠有所幫助。

導(dǎo)讀:SQL Server數(shù)據(jù)庫(kù)的發(fā)展就離不開(kāi)數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型設(shè)計(jì)以及數(shù)據(jù)庫(kù)的優(yōu)化,要想做好數(shù)據(jù)庫(kù)中數(shù)據(jù)類(lèi)型設(shè)計(jì)以及數(shù)據(jù)庫(kù)優(yōu)化工作,就首先要熟練掌握下文中介紹的數(shù)據(jù)類(lèi)型設(shè)計(jì)以及數(shù)據(jù)庫(kù)優(yōu)化的誤區(qū)。

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

 


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

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

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

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

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

 

分析

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

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

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

datetime占用8個(gè)字節(jié),前4個(gè)字節(jié)存儲(chǔ)base date(即1900年1月1日)之前或之后的天數(shù),后4個(gè)字節(jié)存儲(chǔ)午夜后的毫秒數(shù)。值范圍:1753-01-01 到 9999-12-31。

smalldatetime占用4個(gè)字節(jié),前2個(gè)字節(jié)存儲(chǔ)base date(1900年1月1日)之后的天數(shù)。后2個(gè)字節(jié)存儲(chǔ)午夜后的分鐘數(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)來(lái)保存截?cái)嗟娜掌?,那么你的存?chǔ)空間反而更大了。

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

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

 

<!--[if !supportLists]-->三、<!--[endif]-->測(cè)試

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

<!--[if !supportLists]-->(一) <!--[endif]-->測(cè)試前奏:

<!--[if !supportLists]-->1. <!--[endif]-->創(chuàng)建三種數(shù)據(jù)類(lèi)型char(10)、datetime、smalldatetime的表;(表結(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]

<!--[if !supportLists]-->2. <!--[endif]-->插入相同記錄到三個(gè)表中;(這里插入1210000條記錄)

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

<!--[if !supportLists]-->4. <!--[endif]-->查看索引屬性中的索引碎片信息,查看表數(shù)據(jù)和索引占用的空間,測(cè)試[Dates]字段索引的查詢(xún)效率;

<!--[if !supportLists]-->(二) <!--[endif]-->測(cè)試結(jié)果:

<!--[if !supportLists]-->1. <!--[endif]-->數(shù)據(jù)存儲(chǔ)大?。?/p>

 


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

索引存儲(chǔ)信息:

 

(圖3:char(10))

 

(圖4:datetime)

 

(圖5:smalldatetime)

索引查詢(xún)的情況:

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

 

--[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ù)類(lèi)型

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';

SQL Server datetime數(shù)據(jù)類(lèi)型設(shè)計(jì)以及數(shù)據(jù)庫(kù)優(yōu)化誤區(qū)就為大家總結(jié)這么多,可能還不夠全面,以后有機(jī)會(huì)還會(huì)繼續(xù)為大家介紹更多的總結(jié),希望大家都能夠從中有所收獲。

【編輯推薦】

  1. SQL Server 2005 自動(dòng)化刪除表分區(qū)設(shè)計(jì)方案
  2. SQL Server數(shù)據(jù)庫(kù)中對(duì)圖片進(jìn)行保存和輸出
  3. 使用SQL Server 2008導(dǎo)入平面文件
  4. SQL Server 2008內(nèi)存性能監(jiān)控
責(zé)任編輯:迎迎 來(lái)源: 博客園
相關(guān)推薦

2011-05-11 10:39:01

SQL Serverdatetime數(shù)據(jù)類(lèi)優(yōu)化誤區(qū)

2010-11-29 10:09:26

SQL Server

2010-07-12 15:36:45

SQL Server

2010-06-28 14:30:08

SQL Server

2010-07-22 17:57:40

2010-09-06 16:25:46

SQL函數(shù)

2010-09-25 09:45:46

sql server主

2010-07-20 15:54:02

SQL Server數(shù)

2010-07-22 17:47:32

SQL Server數(shù)

2010-10-19 15:54:38

sql server創(chuàng)

2010-09-13 10:21:26

sql server2

2010-07-26 14:21:25

SQL Server數(shù)

2010-07-23 14:18:47

SQL Server數(shù)

2010-07-09 15:10:11

MS SQL Serv

2009-04-16 17:55:55

SQL Server 空間數(shù)據(jù).NET

2010-09-13 09:58:17

SQL Server2

2010-06-30 11:31:55

SQL Server數(shù)

2011-08-25 16:31:36

SQL Servertimestamp

2010-07-22 17:39:44

2010-06-28 11:22:14

MS SQL Serv
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)