成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server BIT類型能占多少空間?

數(shù)據(jù)庫 SQL Server
此文章主要向大家描述的是SQL Server BIT類型所占空間的多少,假如你對(duì)其實(shí)際操作流程有興趣了解的話,以下的文章那就可以點(diǎn)擊以下的文章了。

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

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

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

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

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

 

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

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

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

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

 

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

(2)找到tt表數(shù)據(jù)的***頁(也就是剛才插入的這行數(shù)據(jù)所在頁)的文件號(hào)和頁面號(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)過來看0x00 01 00 00 00 76。其中前兩個(gè)字節(jié)是文件號(hào),后面的是頁面號(hào),所以文件號(hào)是1,頁面號(hào)是118(0x76轉(zhuǎn)換成十進(jìn)制就是118)

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

 

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

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

 

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

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

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

 

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

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

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

 

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

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

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

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

插入的數(shù)據(jù)從第5個(gè)字節(jié)開始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。接下來的ff就是c6的值1023。后面的就是列數(shù)、NULL位圖、變長(zhǎng)列等,這里是討論BIT位占用空間的,所以就不講解后面這些了。

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

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

 

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

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

 

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

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

【編輯推薦】

  1. MS SQL Server 2000系統(tǒng)數(shù)據(jù)類型有哪些?
  2. SQL server DateDiff 函數(shù)語法中的命名參數(shù)
  3. 對(duì)SQL Server 2005 BI的描述
  4. SQL Server 日期操作全接觸,嘻嘻
  5. SQL Server 易混淆的一些數(shù)據(jù)類型有哪些?
責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2010-06-28 15:48:51

SQL Server

2011-02-21 13:06:42

Microsoft S

2009-04-16 17:55:55

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

2010-07-12 14:22:06

SQL Server

2010-07-14 17:42:12

2011-08-25 15:54:30

SQL Serverbit字段類型

2011-02-21 13:06:34

SQL Servr 2

2010-11-08 17:01:53

SQL Server綁

2010-09-14 15:25:58

SQL SERVER字

2017-08-18 14:47:31

SQL ServerCPU過高SQLProfiler

2010-09-13 15:12:26

sql server字

2010-09-06 16:25:46

SQL函數(shù)

2022-09-05 17:09:55

SQL Server數(shù)據(jù)庫

2011-02-21 13:41:14

SQL Server

2023-01-03 11:22:23

C#代碼SQL Server

2011-09-01 13:24:42

SQL Server 呈現(xiàn)GeoRSS訂閱的Bing Maps

2025-05-29 09:10:35

2010-07-16 17:34:34

SQL Server提

2009-08-28 11:38:15

MapPoint

2017-04-07 14:00:02

程序猿SQL ServerCPU
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 在线区| 国产精品99久久久久久大便 | 国产高清视频 | 91精品国产色综合久久不卡蜜臀 | 日韩在线播放一区 | 日本精品一区二区三区在线观看视频 | 成人三级视频在线观看 | 亚洲国产激情 | 黑人粗黑大躁护士 | 亚洲品质自拍视频 | 国产精品成av人在线视午夜片 | www.国产精品 | 日本高清精品 | 中文字幕在线视频一区二区三区 | 日韩精品免费视频 | 久久99精品久久久久婷婷 | 欧美一区二区免费 | 欧美激情精品久久久久久 | 成人看片在线观看 | 狠狠爱免费视频 | 91看片官网| 成年人免费在线视频 | 欧美日韩中文字幕 | 国产电影一区二区在线观看 | 成人不卡视频 | 日韩在线观看中文字幕 | 国产精品美女 | 精品影视 | 人人看人人射 | 91精品欧美久久久久久久 | 亚洲精品视频在线观看视频 | 日韩一级一区 | 午夜丰满寂寞少妇精品 | 中文字幕免费在线观看 | 一区二区三区视频在线观看 | 综合久久久久久久 | 天天操天天天 | 免费观看www7722午夜电影 | 国产高清视频在线观看 | 久久av.com| 欧美精品二区 |