亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server 存儲(1/8):理解數據頁結構

2024-08-31 00:54:32
字體:
來源:轉載
供稿:網友
SQL Server 存儲(1/8):理解數據頁結構

我們都很清楚SQL Server用8KB 的頁來存儲數據,并且在SQL Server里磁盤 I/O 操作在頁級執行。也就是說,SQL Server 讀取或寫入所有數據頁。頁有不同的類型,像數據頁,GAM,SGAM等。在這文章里,讓我們一起來理解下數據頁結構。

SQL Server把數據記錄存在數據頁(Data Page)里。數據記錄是堆表里、聚集索引里葉子節點的行。

數據頁由3個部分組成。頁頭(標頭),數據區(數據行和可用空間)及行偏移數組。

在我們討論在SQL Server里,數據頁內部結構具體是什么樣之前,我們來創建一個表并插入一些記錄。

 1 USE [InternalStorageFormat] 2 GO 3  4 IF EXISTS ( SELECT  * 5             FROM    sysobjects 6             WHERE   id = OBJECT_ID(N'[dbo].[Customers]') 7                     AND OBJECTPROPERTY(id, N'IsUserTable') = 1 ) 8     DROP TABLE dbo.Customers 9 10 CREATE TABLE Customers11 (12    FirstName CHAR(50) NOT NULL,13    LastName CHAR(50) NOT NULL,14    Address CHAR(100) NOT NULL,15    ZipCode CHAR(5) NOT NULL,16    Rating INT NOT NULL,17    ModifiedDate DATETIME NOT NULL,18 )19 GO20 21 22 INSERT INTO dbo.Customers23         ( FirstName ,24           LastName ,25           Address ,26           ZipCode ,27           Rating ,28           ModifiedDate29         )30 VALUES  ( 'Woody' , -- FirstName - char(50)31           'Tu' , -- LastName - char(50)32           'ZUOQIAO YOUXI TOWN LINHAI CITY' , -- Address - char(50)33           '0000' , -- ZipCode - char(5)34           1 , -- Rating - int35           '2015-05-07 10:09:51'  -- ModifiedDate - datetime36         )37         go 2

現在我們要找出SQL Server給這個表分配的頁有哪些,這個就要用到非文檔的命令DBCC IND。它的語法如下:

DBCC IND 命令用于查詢一個存儲對象的內部存儲結構信息,該命令有4個參數, 前3個參數必須指定。語法如下:DBCC IND ( { 'dbname' | dbid }, { 'objname' | objid },{ nonclustered indid | 1 | 0 | -1 | -2 } [, partition_number] )第一個參數是數據庫名或數據庫ID。第二個參數是數據庫中的對象名或對象ID,對象可以是表或者索引視圖。第三個參數是一個非聚集索引ID或者 1, 0, 1, or 2. 值的含義:0: 只顯示對象的in-row data頁和 in-row IAM 頁。1: 顯示對象的全部頁, 包含IAM 頁, in-row數據頁, LOB 數據頁row-overflow 數據頁 . 如果請求的對象含有聚集所以則索引頁也包括。-1: 顯示全部IAM頁,數據頁, 索引頁 也包括 LOB 和row-overflow 數據頁。-2: 顯示全部IAM頁。Nonclustered index ID:顯示索引的全部 IAM頁, data頁和索引頁,包含LOB和 row-overflow數據頁。為了兼容sql server 2000,第四個參數是可選的,該參數用于指定一個分區號.如果不給定值或者給定0, 則顯示全部分區數據。和DBCC PAGE不同的是, SQL Server運行DBCC IND不需要開啟3604跟蹤標志.

我們來執行下列的命令:

1 DBCC IND('InternalStorageFormat','Customers',-1)

SQL Server會給我們如下的輸出結果:

可以看到有2條記錄,一條記錄為頁面類型(PageType)為10的頁和一條記錄為頁面類型(PageType)為1的頁。頁面類型(PageType)10是IAM頁,頁面類型(PageType)1是數據頁,它的頁ID是79.

關于數據庫頁類型如下所示:

  • 1 Data page 堆表和聚集索引的葉子節點數據
  • 2 Index page聚集索引的非葉子節點和非聚集索引的所有索引記錄

  • 3 Text mixed pageA text page that holds small chunks of LOB values plus internal parts of text tree. These can be shared between LOB values in the same partition of an index or heap.

  • 4 Text tree pageA text page that holds large chunks of LOB values from a single column value.

  • 7 Sort page排序時所用到的臨時頁,排序中間操作存儲數據用的。

  • 8 GAM page 全局分配映射(Global Allocation Map,GAM)頁面 這些頁面記錄了哪些區已經被分配并用作何種用途。

  • 9 SGAM page共享全局分配映射(Shared Global Allocation Map,GAM)頁面 這些頁面記錄了哪些區當前被用作混合類型的區,并且這些區需含有至少一個未使用的頁面。

  • 10 IAM page 有關每個分配單元中表或索引所使用的區的信息

  • 11 PFS page 有關頁分配和頁的可用空間的信息

  • 13 boot page 記錄了關于數據庫的信息,僅存于每個數據庫的第9頁

  • 15 file header page記錄了關于數據庫文件的信息,存于每個數據庫文件的第0頁

  • 16 DCM page記錄自從上次全備以來的數據改變的頁面,以備差異備份

  • 17 BCM page有關每個分配單元中自最后一條 BACKUP LOG 語句之后的大容量操作所修改的區的信息

現在我們來看看79號類型為1的數據頁里存放的數據,這個就要用到DBCC PAGE命令,它的語法如下:

dbcc page 命令讀取數據頁結構的命令DBCC Page。該命令為非文檔化的命令,具體如下:   DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])  具體參數描述如下:  dbid 包含頁面的數據庫ID  dbname 包含頁面的數據庫的名稱  filenum 包含頁面的文件編號  pagenum 文件內的頁面  printopt 可選的輸出選項;選用其中一個值:  0:默認值,輸出緩沖區的標題和頁面標題  1:輸出緩沖區的標題、頁面標題(分別輸出每一行),以及行偏移量表  2:輸出緩沖區的標題、頁面標題(整體輸出頁面),以及行偏移量表  3:輸出緩沖區的標題、頁面標題(分別輸出每一行),以及行偏移量表;每一行  后跟分別列出的它的列值  要想看到這些輸出的結果,還需要設置DBCC TRACEON(3604)。

我們來執行下列的命令:

1 DBCC TRACEON(3604)2 DBCC PAGE(InternalStorageFormat,1,79,3)3 GO    

SQL Server會給我們包含4個部分的輸出。第1部分是BUFFER,里面是一些內存分配信息,對此我們沒多少興趣。下一部分是固定96 bytes大小的頁頭(page header),頁頭(page header)會類似如下顯示:

頁頭相關字段的含義:

  • Page @0x08F84000 同BUFFER中的bpage地址
  • m_pageId = (1:79) 數據頁號
  • m_headerVersion = 1 頭文件版本號,一直為1
  • m_type = 1 頁面類型,1為數據頁面
  • m_typeFlagBits = 0x4 數據頁和索引頁為4,其他頁為0
  • m_level = 0 該頁在索引頁(B樹)中的級數
  • m_flagBits = 0x8000 頁面標志
  • m_objId (AllocUnitId.idObj) = 46 同Metadata: ObjectId
  • m_indexId (AllocUnitId.idInd) = 256 同Metadata: IndexId
  • Metadata: AllocUnitId = 72057594040942592存儲單元的ID,sys.allocation_units.allocation_unit_id
  • Metadata: PartitionId = 72057594039304192數據頁所在的分區號,sys.partitions.partition_id
  • Metadata: IndexId = 0 頁面的索引號,sys.objects.object_id&sys.indexes.index_id
  • Metadata: ObjectId = 277576027 該頁面所屬的對象的id,sys.objects.object_id
  • m_prevPage = (0:0)該數據頁的前一頁面;主要用在數據頁、索引頁和IAM頁
  • m_nextPage = (0:0) 該數據頁的后一頁面;主要用在數據頁、索引頁和IAM頁
  • pminlen = 221 定長數據所占的字節數
  • m_slotCnt = 2 頁面中的數據的行數
  • m_freeCnt = 7644 頁面中剩余的空間
  • m_freeData = 544從第一個字節到最后一個字節的空間字節數
  • m_reservedCnt = 0活動事務釋放的字節數
  • m_lsn = (255:8406:2) 日志記錄號
  • m_xactReserved = 0 最新加入到m_reservedCnt領域的字節數
  • m_xdesId = (0:0) 添加到m_reservedCnt的最近的事務id
  • m_GhostRecCnt = 0 幻影數據的行數
  • m_tornBits = 0 頁的校驗位或者被由數據庫頁面保護形式決定分頁保護位取代

再來看下頁面相關分配情況:

  • GAM (1:2) = ALLOCATED 在GAM頁上的分配情況
  • SGAM (1:3) = ALLOCATED 在SGAM頁上的分配情況
  • PFS (1:1) = 0x61 MIXED_EXT ALLOCATED 50_PCT_FULL在PFS頁上的分配情況,該頁為50%滿,
  • DIFF (1:6) = CHANGED
  • ML (1:7) = NOT MIN_LOGGED

接下來就是用于存放實際數據的槽(slot),每條記錄存放一個槽(slot)里。0號槽在頁里擁有第1條數據,1號槽擁有第2條數據,以此類推。通過下面的圖片,你可以看到我們記錄大小是224 bytes,217 bytes(50+50+100+5+4+8) 的定長和7 bytes 的系統行開銷。

頁的最后一部分是行偏移數組表,我們可以用參數為1的DBCC PAGE命令來,在輸出信息的底部獲得。

執行如下的命令:

1 DBCC TRACEON(3604)2 DBCC PAGE(InternalStorageFormat,1,79,3)3 GO    

SQL Server在輸出信息的底部,給我們如下的信息:

這個行偏移表,應該從下往上讀。每條槽條目是一個2 bytes長的指針指向頁里槽偏移量。這里我們插入了2條記錄,所以表里有2個槽條目。第1條記錄指向第96 bytes,剛好在頁頭后。這個行偏移表可以幫助我們管理頁面的記錄。在頁里的行偏移表里,每條記錄需要2 bytes的大小來存儲。于此類似,在堆表上建立的非聚集索引,每個非聚集索引行里都包含一個物理指針映射回堆表里的行記錄。這個物理指針是[文件號:頁號:槽號](file:page:solt)的結構,因此在讀取頁的時候,可以找到堆表里的對應行,再通過行偏移表里槽號里的偏移量,就可以在頁里讀取到對應的行記錄。如果我們要修改頁中間的記錄,我們并不一定需要重組整個頁,我們只要修改偏移表里偏移量即可。

在頁頭我們看到當前頁面還有7644 bytes可以用,我們一起來驗證下。

(8 * 1024) - 96 - (217 * 2)-(7 * 2)-(2 * 2)=7644 bytes

8 * 1024 = 頁的總大小,8K

96= 頁頭大小 96 bytes

217 * 2 = 每條記錄的總長 * 記錄數

7 * 2 = 每條記錄的系統行開銷 * 記錄數

2 * 2 = 行偏移表里每槽占用字節數 * 記錄數

現在我們已經知道了頁的結構,我們一起來小結下。

頁是 8KB 的大小,即 8192 bytes,固定 96 bytes的大小給頁頭使用,接下來是具體的數據以槽的方式存儲。數據記錄的最大長度是 8060 bytes(包括 7 bytes的系統行開銷),因此一條記錄中你擁有的最大字節數是 8053 bytes。下列的表創建語句會失敗。

1 CREATE TABLE Maxsize(2 id         CHAR(8000) NOT NULL,3 id1        CHAR(54) NOT NULL4 )

剩下的 36 bytes (8192-96-8060)保留給槽數組(Slot array)或者任何轉發行返回指針(forwarding row back pointer)(每條10 bytes)。這就意味一個頁不一定就能保存18(36/2)條記錄。槽數組(Slot array)根據你的記錄數從下往上增長。如果記錄長度小,頁里就可以存儲更多的記錄,偏移表也會自下而上占用更多的空間。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品av在线播放| 成人免费看黄网站| 国产一区二区黑人欧美xxxx| 国产精品自产拍高潮在线观看| 亚洲一区二区三| 欧美日韩国产在线看| 国产v综合ⅴ日韩v欧美大片| 91国内精品久久| 国产综合视频在线观看| 精品国产成人av| 欧美精品一区在线播放| 日韩精品丝袜在线| 成人h片在线播放免费网站| 亲子乱一区二区三区电影| 久久久久久69| 久久6免费高清热精品| 欧美黄色小视频| 亚洲美女www午夜| 欧美亚洲另类激情另类| 中文字幕在线亚洲| 欧美夫妻性生活视频| 日韩成人在线网站| 欧美激情视频播放| 国产69精品久久久久9999| 亚洲国产精品va在线观看黑人| 日韩一区二区三区国产| 97在线视频免费播放| 最新国产成人av网站网址麻豆| 丝袜一区二区三区| 麻豆国产va免费精品高清在线| 亚洲午夜精品视频| 日韩av网站导航| 国产精品劲爆视频| 国产美女扒开尿口久久久| 久久久久久久91| 日韩av手机在线| 日韩视频免费在线观看| 91情侣偷在线精品国产| 少妇激情综合网| 精品久久久久久中文字幕| 久久久亚洲天堂| www.欧美精品| 日韩欧美在线一区| www.xxxx精品| 97在线看免费观看视频在线观看| 亚洲日本欧美日韩高观看| 亚洲日本成人女熟在线观看| 国产欧亚日韩视频| 麻豆一区二区在线观看| 日韩高清电影免费观看完整| 精品人伦一区二区三区蜜桃免费| 久久免费精品视频| 欧美一级视频一区二区| 性金发美女69hd大尺寸| 中文字幕日韩av综合精品| 日韩综合中文字幕| 91精品国产自产在线| 九九视频这里只有精品| 色中色综合影院手机版在线观看| 久久影院资源站| 国产精品久久久久91| 亚洲人成绝费网站色www| 亚洲精品一区二区久| 亚洲欧洲黄色网| 国产精品一区久久| 亚洲影视九九影院在线观看| 久久久国产精品亚洲一区| 最近2019中文字幕第三页视频| 91九色单男在线观看| 久久久久久美女| 色综合色综合网色综合| 懂色av中文一区二区三区天美| 超碰精品一区二区三区乱码| 精品高清一区二区三区| 亚洲国模精品一区| 欧美性猛xxx| 亚洲一级黄色av| 久久伊人91精品综合网站| 国产精品99久久久久久久久久久久| 亚洲伊人久久大香线蕉av| 亚洲国产欧美一区| 日韩欧美成人免费视频| 日韩69视频在线观看| 亚洲日本中文字幕免费在线不卡| 国产乱人伦真实精品视频| 九九精品在线观看| 亚洲男人天堂久| 69av成年福利视频| 青青久久av北条麻妃黑人| 亲子乱一区二区三区电影| 欧美午夜精品久久久久久久| 国产精品欧美日韩| 全亚洲最色的网站在线观看| 尤物yw午夜国产精品视频| 欧美日本精品在线| 亚洲成年网站在线观看| 日韩av在线影视| 在线视频亚洲欧美| 91久久精品日日躁夜夜躁国产| 久久激情视频免费观看| 国产精品一区二区三区久久| 欧美日韩美女在线观看| 亚洲电影免费观看高清完整版| 久久av在线播放| 日韩h在线观看| 精品视频在线播放免| 久久精品国产96久久久香蕉| 成人性生交大片免费观看嘿嘿视频| 黑人巨大精品欧美一区二区一视频| 91社区国产高清| 国产精品久久久久久久9999| 亚洲国产成人在线视频| 91精品国产99| 亚洲精品欧美极品| 欧美伊久线香蕉线新在线| 久99九色视频在线观看| 国产精品视频在线播放| 欧美激情伊人电影| 欧美视频中文在线看| 欧美情侣性视频| 亚洲欧美三级伦理| www.美女亚洲精品| 一区二区三区精品99久久| 亚洲18私人小影院| 欧美精品激情在线| 国产精品久久网| 亚洲2020天天堂在线观看| 亚洲一区二区免费在线| 亚洲黄色在线看| 亚洲乱亚洲乱妇无码| 福利精品视频在线| 日韩av综合中文字幕| 91av在线国产| 最近2019好看的中文字幕免费| 亚洲国产一区二区三区四区| 日韩精品欧美国产精品忘忧草| 久久夜精品香蕉| 欧美大片在线看免费观看| 91精品国产91久久久久久吃药| 欧美国产激情18| 精品一区二区亚洲| 亚洲午夜激情免费视频| 成人免费自拍视频| 久久网福利资源网站| 欧美另类老女人| 日韩av免费在线看| 尤物九九久久国产精品的特点| 日韩禁在线播放| 国产精品丝袜高跟| 日本不卡免费高清视频| 亚洲欧美三级在线| 91色视频在线观看| 国内精品一区二区三区四区| 国产成+人+综合+亚洲欧洲| 性亚洲最疯狂xxxx高清| 欧美高清性猛交| 欧美丝袜美女中出在线| 欧美香蕉大胸在线视频观看| 中文字幕精品www乱入免费视频| 一区二区三区四区精品| 日韩黄色高清视频| 亚洲美女喷白浆| 亚洲人成在线观| 日本午夜精品理论片a级appf发布|