目录深入显出(7/10卡塔尔(قطر‎:非独一列上的非集中索引

在目录深入浅出:接收正确并适当的聚焦索引键里,大家评论了在非独一列上如哪管理集中键。我们领略SQL
Server会给持有爆发再次的凑集键扩大4
bytes的值。同样,非聚焦索引在B树的全部层扩张集中键,让在下大器晚成层的笔录标记唯后生可畏。至于聚焦索引,uniquifier 只在再一次时扩充。对于非集中索引,纵然创立索引不唯不平日,聚焦键会在全数记录扩大。假设非聚焦索引是以独一定义的,SQL
Server只在叶子层扩充集中键,用做书签查找(bookmark lookup)操作。

1 SELECT * FROM dbo.sp_table_pages ORDER BY IndexLevel DESC 

在目录深入浅出:非聚集索引的B树布局在联谊表里,大家谈谈了非集中索引。我们关系,唯生机勃勃非聚集索引能够让所讨论的标题变得简单非常多。我们已经理解了非聚焦索引的通用布局,今后大家来看下在非独一列上的非聚集索引的贮存布局。

累积再次回到298条记下,富含1个IAM页,2八十八个索引页,我们用下列语句找下根层的页号:

咱俩来看上半局地的根页,聚集键(SalesOrderDetailid)被加到了根页。假若你和目录深入显出:非聚焦索引的B树结构在汇集表里的根页相比,会意识这里的根页里从未聚焦键,唯有在叶子页里才方可找到聚焦键。在您把非聚焦索引定义为唯生机勃勃或非唯风流洒脱(unique
or non unique)时,叶子层的页布局不会时有产生改动。

1 DBCC TRACEON(3604)2 DBCC PAGE(IndexDB,1,3720,3)

大家用DBCC IND看下非聚焦索引的页面分配情形,并搜索根页。

图片 1

图片 2

从上航海用体育场地我们可见看出,productid值为707,salesorderid值为43665的笔录完整音讯,能够在Heap逍客ID
0xB800000001003E00职位找到。上边包车型地铁询问能够帮大家把奥德赛ID转为文件号:页号:槽号(FileId:PageId:SlotNo)格式。

1 TRUNCATE TABLE dbo.sp_table_pages2 INSERT INTO sp_table_pages EXEC('DBCC IND(IndexDB,SalesOrderDetail,2)')3 GO4 5 SELECT * FROM dbo.sp_table_pages ORDER BY IndexLevel DESC --根节点/索引页

图片 3

 

那是因为,SalesorderDetailId列未有概念为聚焦键,在非聚集索引的叶子层未有那列。为了防止键查找(key
lookup)操作,大家必要将列限定到独有非聚集索引键(ProductKey
,salesorderid)。

您大概已经注意到,在我们上述的事例里,即便非集中索引键是天下无双的,SQL
Server依旧只当它是非集中索引,因为当大家创设非集中索引时没加unique关键字。在目录全体层扩张聚焦键(或Heap
WranglerID)大概会增加越多的索引层IO操作,这一个看聚焦键的尺寸而定。因而在富有景况下,我们定义非聚集索引时,思索接收独一列(或多列)作为非聚焦键特别关键。

出口结果,和集聚表里的非聚焦索引的根页结构是大同小异的。

 1 SELECT * INTO dbo.SalesOrderDetailHeap FROM AdventureWorks2008R2.Sales.SalesOrderDetail 2 GO 3 CREATE INDEX Ix_ProductId ON SalesOrderDetailHeap (ProductId,Salesorderid) 4 GO 5 SELECT index_id FROM sys.indexes WHERE name='Ix_ProductId' AND  6 OBJECT_NAME(OBJECT_ID)='SalesOrderDetailHeap' 7 GO 8 DBCC ind('IndexDB','SalesOrderDetailHeap',2) 9 GO10 TRUNCATE TABLE dbo.sp_table_pages11 INSERT INTO sp_table_pages EXEC('DBCC IND(IndexDB,SalesOrderDetailHeap,2)')12 SELECT * FROM dbo.sp_table_pages ORDER BY IndexLevel DESC --根节点/索引页13 DBCC TRACEON(3604)14 DBCC PAGE(IndexDB,1,1192,3)--根页15 16 DBCC TRACEON(3604)17 DBCC PAGE(IndexDB,1,1096,3)--叶子页

从输出大家能够见到,productid值为707,salesorderid值为43665的笔录全部列能够在槽号62找到,与1:184:62意味着文件号:1
,页号:184 ,槽号:62完全生机勃勃致。

笔者们看下堆表的景况。

图片 4

在根页大家看来多了Heap
HavalID列,如若您回到看看索引深入显出:非集中索引的B树布局在堆表,你会发觉Heap
索罗德ID列只在叶子层里的页现身,不在根页现身。在你把非集中索引定义为唯大器晚成或非唯豆蔻梢头(unique
or non unique)时,叶子层的页构造不会发出转移。

在“索引深入显出:非聚焦索引的B树布局在集中表”里,大家切磋了在聚焦表上的非集中索引,那篇文章我们争辨下在堆表上的非集中索引。

笔者们创立了SalesOrderDetail表的别本,在SalesOrderDetailId 列定义了唯意气风发聚焦索引,在ProductId和SalesOrderId列定义了非集中索引。注意,在开创非集中索引的时候,作者蓄意避开了利用Unique关键字,固然这一个非聚焦索引键是独占鳌头的。

搜罗非聚焦索引相关音信:

1 DBCC TRACEON(3604)2 DBCC PAGE(IndexDB,1,5128,3)--根页3 4 DBCC TRACEON(3604)5 DBCC PAGE(IndexDB,1,3760,3)--叶子页

 

可以看见,5128页是大家的根页。大家用DBCC
PAGE看下5128页音讯还只怕有叶子页的新闻。

 在聚焦表的非聚焦索引的叶子层,集中键与非聚焦键一起插手了叶子层的页。这里大家并没有集中索引,索引SQL
Server加了个行标志号(8 bytes大小),由文件号(2 bytes),页号(4
bytes)和槽号(2 bytes)组合而成。

1 SELECT * INTO dbo.SalesOrderDetail FROM AdventureWorks2008r2.Sales.SalesOrderDetail2 GO3 CREATE UNIQUE CLUSTERED INDEX ix_SalesOrderDetail ON dbo.SalesOrderDetail(SalesOrderDetailID)4 GO5 CREATE INDEX Ix_ProductId ON SalesOrderDetail(ProductId,Salesorderid)
1 DBCC TRACEON(3604)2 DBCC PAGE(IndexDB,1,3608,3)--叶子节点/索引页

大家来看叁个例子。

近日大家来深入分析下SQL Server怎么着存款和储蓄堆表的非集中索引,首先大家经过DBCC
IND命令查看非集中索引的页分配景况,最后叁个参数,2是Ix_ProductId的索引号。

图片 5

图片 6

图片 7

图片 8

咱俩由此上面包车型大巴查询看看SQL
Server如何使用非集中索引查找堆表上的多寡,点击工具栏的图片 9呈现富含实际的实行布署。

 1 DECLARE @HeapRid BINARY(8) 2 SET @HeapRid = 0xB800000001003E00 3 SELECT    4    CONVERT (VARCHAR(5), 5           CONVERT(INT, SUBSTRING(@HeapRid, 6, 1) 6                + SUBSTRING(@HeapRid, 5, 1))) 7   + ':' 8   + CONVERT(VARCHAR(10), 9           CONVERT(INT, SUBSTRING(@HeapRid, 4, 1)10                + SUBSTRING(@HeapRid, 3, 1)11                + SUBSTRING(@HeapRid, 2, 1)12                + SUBSTRING(@HeapRid, 1, 1)))13   + ':'14      + CONVERT(VARCHAR(5),15           CONVERT(INT, SUBSTRING(@HeapRid, 8, 1)16                + SUBSTRING(@HeapRid, 7, 1)))17                AS 'Fileid:Pageid:Slot' 
1 DBCC ind('IndexDB','SalesOrderDetailHeap',2)

能够见见,indexlevel列最大值1的页号是3270,那个页正是根页,因为indexlevel列最大值是1,所以这么些堆表的非聚焦索引的B树构造唯有2层,即根层和叶子层,也便是说286个索引页中,1个页是根层的根页(也是索引页),2九十个页是叶子层的索引页。我们来寻访3270页的新闻。

1:184:62意味文件号:1 ,页号:184 ,槽号:62。我们来看看184页。 

相关文章