日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
SQLServerBIT類(lèi)型能占多少空間?

此文章主要向大家講述的是SQL Server BIT類(lèi)型在實(shí)際操作中占用了多少空間的介紹,在實(shí)際操作中一般的數(shù)據(jù)類(lèi)型如INT、以及CHAR與tinyint等相關(guān)的數(shù)據(jù)類(lèi)型,他們所占用的存儲(chǔ)空間都是以Byte字節(jié)為單位的。

但是SQL Server BIT類(lèi)型由于只有0和1或者說(shuō)false和true,這種情況只需要一個(gè)Bit位就可以表示了,那么在SQL Server中BIT類(lèi)型到底占用了多少空間?是不是由一個(gè)Bit位來(lái)存儲(chǔ)的?或者可能是使用一個(gè)字節(jié)來(lái)存儲(chǔ)的?

這兩個(gè)答案都不正確!實(shí)際上SQL Server BIT類(lèi)型占用的空間與BIT類(lèi)型的列所在表的位置有關(guān),有些情況下BIT占用了一個(gè)字節(jié),有些情況下BIT實(shí)際占用了幾個(gè)位(幾個(gè)BIT類(lèi)型的列共用一個(gè)字節(jié))。下面就來(lái)具體分析一下:

單獨(dú)的BIT類(lèi)型的列將占用一個(gè)字節(jié)。

所謂單獨(dú)就是指一個(gè)BIT類(lèi)型的列的左邊定長(zhǎng)列和右邊定長(zhǎng)列都不是BIT類(lèi)型的列。例如這樣一個(gè)表:

 
 
 
  1. CREATE TABLE tt 
  2. c1 INT PRIMARY KEY, 
  3. c2 BIT NOT NULL, 
  4. c3 CHAR(2) NOT NULL 

SQL Server在存儲(chǔ)表中的數(shù)據(jù)時(shí)先是將表中的列按照原有順序分為定長(zhǎng)和變長(zhǎng)(變長(zhǎng)就是長(zhǎng)度不固定的數(shù)據(jù)類(lèi)型,如varchar,nvarchar,varbinary等)兩組。在數(shù)據(jù)頁(yè)中存儲(chǔ)數(shù)據(jù)時(shí)先存儲(chǔ)所有定長(zhǎng)的數(shù)據(jù),然后再存儲(chǔ)變長(zhǎng)的數(shù)據(jù)。這里由于c2列的左邊是int類(lèi)型,右邊是char類(lèi)型,都是定長(zhǎng)的,而且不是SQL Server BIT類(lèi)型,所以c1和c3之間必須留出一個(gè)字節(jié)來(lái)存儲(chǔ)c2,雖然c2只用到了其中的一個(gè)位。

下面我們來(lái)驗(yàn)證一下是否真是如我所說(shuō):

(1)插入一行數(shù)據(jù):

 
 
 
  1. INSERT INTO tt VALUES(1,1,'aa') 

(2)找到tt表數(shù)據(jù)的***頁(yè)(也就是剛才插入的這行數(shù)據(jù)所在頁(yè))的文件號(hào)和頁(yè)面號(hào):

 
 
 
  1. SELECT first_page 
  2. FROM sys.partitions p 
  3. INNER JOIN sys.system_internals_allocation_units a 
  4. ON p.partition_id=a.container_id 
  5. WHERE OBJECT_IDOBJECT_ID= OBJECT_ID('dbo.tt') 

我這里返回的是0x76 00 00 00 01 00,這里需要反轉(zhuǎn)過(guò)來(lái)看0x00 01 00 00 00 76。其中前兩個(gè)字節(jié)是文件號(hào),后面的是頁(yè)面號(hào),所以文件號(hào)是1,頁(yè)面號(hào)是118(0x76轉(zhuǎn)換成十進(jìn)制就是118)

(3)使用DBCC page命令查看該頁(yè)的內(nèi)部結(jié)構(gòu):

 
 
 
  1. DBCC traceon(3604) 
  2. DBCC page(TestDB,1,118,3) 

這兒DBCC traceon(3604)表示將頁(yè)面內(nèi)容直接輸出,TestDB是我創(chuàng)建的tt表所在的數(shù)據(jù)庫(kù),1和118前面已經(jīng)說(shuō)了。***一個(gè)是打印選項(xiàng)。0表示只輸出頁(yè)頭;1則不會(huì)輸出所有內(nèi)容,只是輸出有數(shù)據(jù)的內(nèi)容;2表示完整的輸出這個(gè)頁(yè)的內(nèi)容,3則和1差不多,但是要每條記錄分別列出列的值。以下是輸出的需要關(guān)注的內(nèi)容:

 
 
 
  1. 00000000: 10000b00 01000000 01616103 0000??????.........aa... 

關(guān)于數(shù)據(jù)行的具體格式我就不在這里多說(shuō)了,在《SQL Server 2005技術(shù)內(nèi)幕 存儲(chǔ)引擎》中有詳細(xì)介紹。我們插入的數(shù)據(jù)從第5個(gè)字節(jié)開(kāi)始,是01000000 016161。這兒01000000就是c1,由于是int類(lèi)型,所以占用4個(gè)字節(jié)。接下來(lái)01就是c2,在這里占用了1字節(jié)。再接下來(lái)6161就是c3了。

2.多個(gè)BIT類(lèi)型的列之間使用變長(zhǎng)數(shù)據(jù)類(lèi)型列分開(kāi),則去掉變長(zhǎng)列,然后看連續(xù)的SQL Server BIT類(lèi)型列的個(gè)數(shù),每列占用一個(gè)位,如果多余了8列那就再占用更多的字節(jié)。例如創(chuàng)建這樣的表:

 
 
 
  1. CREATE TABLE vtt 
  2. c1 BIT NOT NULL, 
  3. c2 VARCHAR(5) NOT NULL, 
  4. c3 BIT NOT NULL, 
  5. c4 NVARCHAR(5) NULL, 
  6. c5 BIT NULL, 
  7. c6 INT NOT NULL 

這里將變長(zhǎng)列篩選出來(lái)后就變成了c1、c3、c5、c6,有3個(gè)BIT類(lèi)型列是連續(xù)的,所以c1、c3、c5將公用一個(gè)字節(jié)。接下來(lái)就來(lái)驗(yàn)證一下:

(1)插入一條示例數(shù)據(jù):

 
 
 
  1. INSERT INTO vtt VALUES(1,'abc',1,N'xyz',0,1023) 

(2)用前面用的SQL語(yǔ)句,同樣的方法,找出vtt表的***頁(yè)為:0xC00000000100,對(duì)應(yīng)的就是文件號(hào)1,頁(yè)號(hào)192

(3)查看該頁(yè)的內(nèi)部數(shù)據(jù):

 
 
 
  1. 00000000: 30000900 03ff0300 00060000 02001500 ?0. ............. 
  2. 00000010: 1b006162 63780079 007a00?????????????..abcx.y.z

插入的數(shù)據(jù)從第5個(gè)字節(jié)開(kāi)始03ff…… 這兒03就是c1、c3、c5的數(shù)據(jù),03轉(zhuǎn)換成二進(jìn)制就是00000011。c1列對(duì)應(yīng)***位1,c3對(duì)應(yīng)倒數(shù)第二位1,c5對(duì)應(yīng)倒數(shù)第三位0。接下來(lái)的ff就是c6的值1023。后面的就是列數(shù)、NULL位圖、變長(zhǎng)列等,這里是討論BIT位占用空間的,所以就不講解后面這些了。

3.一個(gè)表中有多個(gè)SQL Server BIT類(lèi)型的列,其順序是否連續(xù)決定了SQL Server BIT位是否可以共享一個(gè)字節(jié)。SQL Server中按照列順序存儲(chǔ),***列和***一列都是BIT數(shù)據(jù)類(lèi)型列,不可以共用一個(gè)字節(jié)。

也就是說(shuō)下面的表t1和表t2占用的空間是不同的,t1數(shù)據(jù)占用了7字節(jié),t2數(shù)據(jù)占用了8字節(jié)。

 
 
 
  1. CREATE TABLE t1 
  2. c1 INT PRIMARY KEY, 
  3. c2 BIT NOT NULL, 
  4. c3 BIT NOT NULL, 
  5. c4 CHAR(2) NOT NULL 
  6. CREATE TABLE t2 
  7. c1 INT PRIMARY KEY, 
  8. c2 BIT NOT NULL, 
  9. c4 CHAR(2) NOT NULL, 
  10. c3 BIT NOT NULL 

但是在下面的t3和t4表中,由于中間是變長(zhǎng)數(shù)據(jù)類(lèi)型,所以他們的BIT列占用的數(shù)據(jù)空間是相同的。

 
 
 
  1. CREATE TABLE t3 
  2. c1 INT NOT NULL, 
  3. c2 BIT NOT NULL, 
  4. c3 VARCHAR(2) NOT NULL, 
  5. c4 BIT NOT NULL 
  6. CREATE TABLE t4 
  7. c1 INT NOT NULL, 
  8. c2 BIT NOT NULL, 
  9. c4 BIT NOT NULL, 
  10. c3 VARCHAR(2) NOT NULL 

以上的相關(guān)內(nèi)容就是對(duì)SQL Server BIT類(lèi)型到底占用了多少空間的介紹,望你能有所收獲。


本文標(biāo)題:SQLServerBIT類(lèi)型能占多少空間?
文章地址:http://www.dlmjj.cn/article/coehcjo.html