这篇文章和我另一篇文章是相辅相成的,在看《SQLSERVER2012 列存储索引的简单研究和测试》这篇文章之前希望大家先看一下这篇文章o(∩_∩)o
LOB页面相信大家都不会陌生,LOB专门存储大型对象数据的,类型text、image这些数据类型的数据就是存储在LOB页面
MSDN上的解释是这样的:
http://technet.microsoft.com/zh-cn/library/ms189051(v=sql.105).aspx
LOB_DATA:以下列一种或多种数据类型存储的大型对象数据:text、ntext、image、xml、varchar(max)、nvarchar(max)、
varbinary(max) 或 CLR 用户定义类型 (CLR UDT)。页的类型为 Text/Image。
LOB_DATA 分配单元
当表或索引有一个或多个 LOB 数据类型时,将为每个分区分配一个 LOB_DATA 分配单元,以管理该数据的存储。
LOB 数据类型包括text、ntext、image、xml、varchar(max)、nvarchar(max)、varbinary(max) 和 CLR 用户定义类型。
但是在DBCC IND的结果里面,有这样的解释
PageType 页面类型:1:数据页面;2:索引页面;3:Lob_mixed_page;4:Lob_tree_page;10:IAM页面
究竟Lob_mixed_page和Lob_tree_page有什么区别?
堆表
先执行下面的SQL语句,用来存储DBCC IND的结果
1 --执行下面语句,看一下DBCC IND的结果 2 --先说明一下: 3 -- 4 --PageType 页面类型:1:数据页面;2:索引页面;3:Lob_mixed_page;4:Lob_tree_page;10:IAM页面 5 -- 6 --IndexID 索引ID:0 代表堆, 1 代表聚集索引, 2-250 代表非聚集索引 大于250就是text或image字段 7 CREATE TABLE DBCCResult ( 8 PageFID NVARCHAR(200), 9 PagePID NVARCHAR(200), 10 IAMFID NVARCHAR(200), 11 IAMPID NVARCHAR(200), 12 ObjectID NVARCHAR(200), 13 IndexID NVARCHAR(200), 14 PartitionNumber NVARCHAR(200), 15 PartitionID NVARCHAR(200), 16 iam_chain_type NVARCHAR(200), 17 PageType NVARCHAR(200), 18 IndexLevel NVARCHAR(200), 19 NextPageFID NVARCHAR(200), 20 NextPagePID NVARCHAR(200), 21 PrevPageFID NVARCHAR(200), 22 PrevPagePID NVARCHAR(200) 23 )
建立一个堆表
1 CREATE TABLE LobTestTable(id INT,NAME varchar(200) ,comment TEXT) 2 GO
插入3条记录
1 INSERT INTO [dbo].[LobTestTable] ( [id],name, [comment] ) 2 SELECT 1,'中国','你好你好你好你好你好你好你好你好' UNION ALL 3 SELECT 2,'中国','他好他好他好他好他好他好他好他好' UNION ALL 4 SELECT 3,'中国','我好我好我好我好我好我好我好我好'
1 SELECT * FROM [dbo].[LobTestTable] 2 GO
把结果存入[DBCCResult]里
1 --TRUNCATE TABLE [dbo].[DBCCResult] 2 INSERT INTO DBCCResult EXEC ('DBCC IND(pratice,LobTestTable,-1) ') 3 4 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC
可以看到,pagetype为3,即是Lob_mixed_page来存储text数据
而且普通的数据页和LOB页是由不同的IAM页来管理的,LOB页面由pageid为14575的页面来管理
普通数据页面由pageid为15608的页面来管理
我们看一下14576页面和14550页面到底存放了什么?
14576页面
1 PAGE: (1:14576) 2 3 4 BUFFER: 5 6 7 BUF @0x03E8A5E4 8 9 bpage = 0x193C0000 bhash = 0x00000000 bpageno = (1:14576) 10 bdbid = 5 breferences = 0 bUse1 = 3859 11 bstat = 0xc0010b blog = 0x212159bb bnext = 0x00000000 12 13 PAGE HEADER: 14 15 16 Page @0x193C0000 17 18 m_pageId = (1:14576) m_headerVersion = 1 m_type = 1 19 m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x8000 20 m_objId (AllocUnitId.idObj) = 438 m_indexId (AllocUnitId.idInd) = 256 21 Metadata: AllocUnitId = 72057594066632704 22 Metadata: PartitionId = 72057594057261056 Metadata: IndexId = 0 23 Metadata: ObjectId = 891150220 m_prevPage = (0:0) m_nextPage = (0:0) 24 pminlen = 8 m_slotCnt = 3 m_freeCnt = 7979 25 m_freeData = 207 m_reservedCnt = 0 m_lsn = (2922:21125:41) 26 m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 27 m_tornBits = 0 28 29 Allocation Status 30 31 GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATED 32 PFS (1:8088) = 0x61 MIXED_EXT ALLOCATED 50_PCT_FULL DIFF (1:6) = CHANGED 33 ML (1:7) = NOT MIN_LOGGED 34 35 Slot 0 Offset 0x60 Length 37 36 37 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS 38 39 Memory Dump @0x0917C060 40 41 00000000: 30000800 01000000 03006802 00150025 †0.........h....% 42 00000010: 80d6d0b9 fa0000f1 71250000 00d63800 †........q%....8. 43 00000020: 00010000 00††††††††††††††††††††††††††..... 44 45 Slot 0 Column 0 Offset 0x4 Length 4 46 47 id = 1 48 49 Slot 0 Column 1 Offset 0x11 Length 4 50 51 NAME = 中国 52 53 comment = [Textpointer] Slot 0 Column 2 Offset 0x15 Length 16 54 55 TextTimeStamp = 160825409536 RowId = (1:14550:0) 56 57 Slot 1 Offset 0x85 Length 37 58 59 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS 60 61 Memory Dump @0x0917C085 62 63 00000000: 30000800 02000000 03002002 00150025 †0......... ....% 64 00000010: 80d6d0b9 fa0000f2 71250000 00d63800 †........q%....8. 65 00000020: 00010001 00††††††††††††††††††††††††††..... 66 67 Slot 1 Column 0 Offset 0x4 Length 4 68 69 id = 2 70 71 Slot 1 Column 1 Offset 0x11 Length 4 72 73 NAME = 中国 74 75 comment = [Textpointer] Slot 1 Column 2 Offset 0x15 Length 16 76 77 TextTimeStamp = 160825475072 RowId = (1:14550:1) 78 79 Slot 2 Offset 0xaa Length 37 80 81 Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS 82 83 Memory Dump @0x0917C0AA 84 85 00000000: 30000800 03000000 03002002 00150025 †0......... ....% 86 00000010: 80d6d0b9 fa0000f3 71250000 00d63800 †........q%....8. 87 00000020: 00010002 00††††††††††††††††††††††††††..... 88 89 Slot 2 Column 0 Offset 0x4 Length 4 90 91 id = 3 92 93 Slot 2 Column 1 Offset 0x11 Length 4 94 95 NAME = 中国 96 97 comment = [Textpointer] Slot 2 Column 2 Offset 0x15 Length 16 98 99 TextTimeStamp = 160825540608 RowId = (1:14550:2) 100 101 102 DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。