国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL Server Page結(jié)構(gòu)深入分析

2024-08-31 01:05:14
字體:
供稿:網(wǎng)友

SQL Server存儲數(shù)據(jù)的基本單元是Page,每一個Page的大小是8KB,數(shù)據(jù)文件是由Page構(gòu)成的。在同一個數(shù)據(jù)庫上,每一個Page都有一個唯一的資源標(biāo)識,標(biāo)識符由三部分組成:db_id,file_id,page_id,例如,15:1:8733,15是數(shù)據(jù)庫的ID,1是數(shù)據(jù)文件的ID,8733是Page的編號,Page的編號從0依次遞增。8個連續(xù)的Page組成一個區(qū)(Extent),數(shù)據(jù)文件中已分配(Allocated)的空間被分割成區(qū)的整數(shù)倍。一次磁盤IO操作作用于Page級別,而空間分配的最小單元是區(qū)。

Page是用于存儲數(shù)據(jù)的,不同類型的Page存儲的數(shù)據(jù)是不同的,Page的結(jié)構(gòu)也是不同的。有些Page是用于存儲數(shù)據(jù)的,叫做Data Page,有些Page是用于存儲索引結(jié)構(gòu)中的中間節(jié)點(diǎn)的,叫做Index Page,有些Page是SQL Server存儲引擎使用的,用于管理Page的,叫做系統(tǒng)頁。本文關(guān)注的是Data Page和Index Page,跟數(shù)據(jù)表有關(guān)。

日志文件沒有Page結(jié)構(gòu),它是由一系列的日志記錄構(gòu)成的。

一,Page的結(jié)構(gòu)

每一個Page都由 頭部(Header),內(nèi)容(Content)和行偏移量(Offset)組成,頭部是在Page的開始處,占用96Bytes,用于存儲Page的編號,Page的類型,分配單元(Allocation Unit)等系統(tǒng)信息。注:在單個Page中最多存儲8060Bytes的數(shù)據(jù)。

The maximum amount of data and overhead that is contained in a single row on a page is 8,060 bytes (8 KB).

SQLServer,Page結(jié)構(gòu)

數(shù)據(jù)行存儲在Page Header之后,數(shù)據(jù)行在Page中的物理存儲是無序的,行的邏輯順序是由行偏移(Row Offset)確定的,行偏移存儲在Page的末尾,每一個行偏移是一個Slot,占用2B。行偏移連續(xù)排列在Page的末尾,稱作槽數(shù)組(Slot Array)。行偏移以倒序方式存儲行的偏移量,這意味著,從Page末尾向Page 開頭計(jì)數(shù),第一行的偏移量存儲在Page的末尾Slot中,第二行的偏移量存儲在Page末尾的第二個Slot中。

二,查看Page頭部信息

Page頭部信息存儲的是Page的系統(tǒng)信息,可以使用非正式的命令來查看:

DBCC PAGE(['database name'|database id], file_id, page_number, print_option = [0|1|2|3] )

參數(shù):file_id是數(shù)據(jù)庫文件的ID;page_number是Page在當(dāng)前文件中的編號;print_option是指打印信息的詳細(xì)程度,默認(rèn)值是0,只打印Page Header。

例如,查看資源標(biāo)識符:15:1:8777733 Page的頭部信息:

dbcc traceon(3604)dbcc page(15,1,8777733)

在我的數(shù)據(jù)庫中,該P(yáng)age的頭部信息(移除Buffer的數(shù)據(jù))如下所示,

PAGE: (1:8777733)PAGE HEADER:Page @0x0000005188B02000m_pageId = (1:8777733)    m_headerVersion = 1     m_type = 1m_typeFlagBits = 0x0    m_level = 0       m_flagBits = 0x220m_objId (AllocUnitId.idObj) = 28503 m_indexId (AllocUnitId.idInd) = 256 Metadata: AllocUnitId = 72057595905900544        Metadata: PartitionId = 72057594059423744        Metadata: IndexId = 1Metadata: ObjectId = 1029578706  m_prevPage = (1:8777732)   m_nextPage = (1:8777734)pminlen = 16      m_slotCnt = 2      m_freeCnt = 4513m_freeData = 3675     m_reservedCnt = 0     m_lsn = (1212327:16:558)m_xactReserved = 0     m_xdesId = (0:799026688)   m_ghostRecCnt = 0m_tornBits = -1518328013   DB Frag ID = 1      Allocation StatusGAM (1:8690944) = ALLOCATED   SGAM (1:8690945) = NOT ALLOCATED PFS (1:8775480) = 0x40 ALLOCATED 0_PCT_FULL       DIFF (1:8690950) = CHANGEDML (1:8690951) = NOT MIN_LOGGED

Page 頭部中各個字段的含義:

1,Page的編號

m_pageId = (1:8777733),該P(yáng)age所在的File ID 和Page ID

2,Page的類型

m_type = 1,Page的類型,常見的類型是數(shù)據(jù)頁和索引頁:

1 – data page,用于表示:堆表或聚集索引的葉子節(jié)點(diǎn)
2 – index page,用于表示:聚集索引的中間節(jié)點(diǎn)或者非聚集索引中所有級別的節(jié)點(diǎn)
其他Page類型(系統(tǒng)頁是管理Page的Page,例如,GAM,IAM等)如下:

3 – text mix page,4 – text tree page,用于存儲類型為文本的大對象數(shù)據(jù)
7 – sort page,用于存儲排序操作的中間數(shù)據(jù)結(jié)果
8 – GAM page,用于存儲全局分配映射數(shù)據(jù)GAM(Global Allocation Map),每一個數(shù)據(jù)文件被分割成4GB的空間塊(Chunk),每一個Chunk都對應(yīng)一個GAM數(shù)據(jù)頁,GAM數(shù)據(jù)頁出現(xiàn)在數(shù)據(jù)文件特定的位置處,一個bit映射當(dāng)前Chunk中的一個區(qū)。
9 – SGAM page,用于存儲SGAM頁(Shared GAM)
10 – IAM page,用于存儲IAM頁(Index Allocation Map)
11 – PFS page,用于存儲PFS頁(Page Free Space)
13 – boot page,用于存儲數(shù)據(jù)庫的信息,只有一個Page,Page的標(biāo)識符是:db_id:1:9,
15 – file header page,存儲數(shù)據(jù)文件的數(shù)據(jù),數(shù)據(jù)庫的每一個文件都有一個,Page的編號是0。
16 – diff map page,存儲差異備份的映射,表示從上一次完整備份之后,該區(qū)的數(shù)據(jù)是否修改過。
17 – ML map page,表示從上一次備份之后,在大容量日志(bulk-Logged)操作期間,該區(qū)的數(shù)據(jù)是否被修改過,This is what allows you to switch to bulk-logged mode for bulk-loads and index rebuilds without worrying about breaking a backup chain.
18 – a page that's be deallocated by DBCC CHECKDB during a repair operation.
19 – the temporary page that ALTER INDEX … REORGANIZE (or DBCC INDEXDEFRAG) uses when working on an index.
20 – a page pre-allocated as part of a bulk load operation, which will eventually be formatted as a ‘real' page.

3,Page在索引中的級數(shù)

數(shù)據(jù)頁在索引中的索引級數(shù),m_level=0,表示處于Leaf Level。

對于堆表(Heap),m_level=0表示的是Data Page;
對于聚集索引,m_level=0表示的是Data Page;
對于非聚集索引,m_level=0表示的是葉子節(jié)點(diǎn)

4, Page的元數(shù)據(jù)

Page的元數(shù)據(jù)十分重要,不僅能夠查看處Page所在的Object,甚至能夠查看該P(yáng)age所在的分配單元和分區(qū)ID,在死鎖進(jìn)行故障排除時十分有用

Metadata: AllocUnitId =72057595905900544,該P(yáng)age所在的分配單元ID(allocation_unit_id)
Metadata: PartitionId =72057594059423744,該P(yáng)age所在的分區(qū)的分區(qū)ID(partition_id)
Metadata: IndexId = 1,該P(yáng)age所在的索引ID
Metadata: ObjectId = 1029578706,用于表示Page所屬對象的object_id
5,page的鏈指針

由于數(shù)據(jù)表的Page并不是單獨(dú)存在的,而是通過雙向鏈?zhǔn)浇Y(jié)構(gòu)連接在一起的,

m_prevPage = (1:8777732) :用于表示前一個page (FileID : PageID)
m_nextPage = (1:8777734) ?。河糜诒硎鞠乱粋€page (FileID:PageID)

6, 其他頭部字段

m_slotCnt = 2 :頁面中Slot的數(shù)量,用于Page中存儲的數(shù)據(jù)行數(shù)
m_freeCnt = 4513  :頁面中剩余的空間,單位是字節(jié),還剩83字節(jié)的空間 
m_reservedCnt = 0 :為活動事務(wù)保留的存儲空間,單位是字節(jié)
m_ghostRecCnt = 0 :頁面中存在的幽靈記錄的總數(shù)(ghost record count)
關(guān)于Page頭部的信息,可以閱讀《Inside the Storage Engine: Anatomy of a page》;

三,利用Page的元數(shù)據(jù)排除死鎖

Page的元數(shù)據(jù)包含分區(qū)ID,索引ID和對象ID,用戶可以使用這些元數(shù)據(jù),分析死鎖產(chǎn)生的原因。系統(tǒng)追蹤到產(chǎn)生死鎖的資源,可能是一個Page的資源標(biāo)識符,如果能夠確認(rèn)發(fā)生死鎖是由于數(shù)據(jù)表或索引的分區(qū)不合理導(dǎo)致的,那么可以重新設(shè)置分區(qū)列,或者設(shè)置分區(qū)邊界值,把單個分區(qū)拆分成多個分區(qū),這樣就能把競爭的臨界資源分配到不同的分區(qū)中,避免查詢請求對資源的競爭,進(jìn)而減少死鎖的發(fā)生。

Metadata: PartitionId ,該P(yáng)age所在的分區(qū)的分區(qū)ID(partition_id);
Metadata: IndexId ,該P(yáng)age所在索引ID;
Metadata: ObjectId,用于表示對象的object_id;

 

注:相關(guān)教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 赤水市| 株洲县| 东丽区| 航空| 从江县| 永寿县| 卓资县| 瑞昌市| 安仁县| 家居| 江源县| 东宁县| 虹口区| 陕西省| 诸城市| 怀宁县| 神木县| 常德市| 乌审旗| 博湖县| 丹寨县| 海口市| 赤城县| 尉氏县| 阿合奇县| 广宁县| 三原县| 麦盖提县| 宣威市| 乐至县| 图们市| 义乌市| 鹰潭市| 平顺县| 山阳县| 台山市| 朝阳区| 泗水县| 铜陵市| 公安县| 曲靖市|