当前位置:Gxlcms > 数据库问题 > SQL Server索引内部结构:SQL Server索引的阶梯级别10

SQL Server索引内部结构:SQL Server索引的阶梯级别10

时间:2021-07-01 10:21:17 帮助过:24人阅读

CREATE NONCLUSTERED INDEX IX_Full_Name

ON Personnel.Employee

(

LastName,

FirstName,

)

GO

图表注释: 指向页面的指针由数据库文件编号和页码组成。 因此,指针值为5:4567指向数据库文件#5的第4567页。 大部分示例值都来自AdventureWorks数据库中的Person.Contact表。 为了说明的目的,还添加了其他一些内容。 卡尔·奥尔森是样本中最受欢迎的名字。 有很多Karl Olsens,他们的条目跨越了整个中级索引页面。

技术分享图片

图1 - 索引的垂直切片 为了清晰起见,图表与以下方面的典型索引不同: 典型索引中每页的条目数量将大于图中所示的数量,因此,除根之外的每个级别的页面数量将大于所示的数量。尤其是,叶级将比我们的空间限制图中显示的要多得多。 实际索引的条目在页面上不排序。这是页面的条目偏移指针,提供顺序访问条目。 (有关偏移指针的更多信息,请参

索引的物理顺序和逻辑顺序之间的相关性往往比图中所示的要高。索引的物理和逻辑顺序之间缺乏相关性被称为外部碎片,在第11级 - 碎片中讨论。 如前所述,一个指数可以有多个中间水平。 就好像我们的白页用户正在寻找海伦·迈耶,打开电话簿,发现第一页,只有第一页是粉红色的。在粉色页面的排序条目列表中,有一个表示“对于”费尔南德斯,塞尔达“和”奥尔森,卡尔“之间的名字见蓝色页面5:431。当我们的用户转到蓝页5:431时,该页面上的一个条目说:“Kumar,Kevin和Nara,Alison之间的名字见第5页:2006”。粉红色的页面对应于根,蓝色页面对应中间层次,白色页面是叶子。 指数深度 根页面的位置与索引的其他信息一起存储在系统表中。每当SQL Server需要访问与索引键值相匹配的索引条目时,它都会从根页面开始,并在索引中的每个级别处理一个页面,直到到达包含该索引键的条目的叶级页面。在我们的十亿行表中的例子中,五个页面读取将SQL Server从根页面转移到叶级页面及其所需的条目;在我们的图解例子中,三个阅读就足够了。在聚集索引中,该叶级别条目将是实际的数据行;在非聚集索引中,此条目将包含聚簇索引键列或RID值。 索引的级数或深度取决于索引键的大小和条目数。在AdventureWorks数据库中,没有索引的深度大于三。在具有非常大的表格或非常宽的索引键列的数据库中,可能会出现6或更大的深度。 sys.dm_db_index_physical_stats函数提供有关索引的信息,包括索引类型,深度和大小。这是一个可以查询的表值函数。清单1中显示的示例返回SalesOrderDetailtable的所有索引的摘要信息。

 

SELECT OBJECT_NAME(P.OBJECT_ID) AS ‘Table‘

 

     , I.name AS ‘Index‘

 

     , P.index_id AS ‘IndexID‘

 

     , P.index_type_desc

 

     , P.index_depth

 

     , P.page_count

 

  FROM sys.dm_db_index_physical_stats (DB_ID(),

 

                                       OBJECT_ID(‘Sales.SalesOrderDetail‘),

 

                                       NULL, NULL, NULL) P

 

  JOIN sys.indexes I ON I.OBJECT_ID = P.OBJECT_ID

 

                    AND I.index_id = P.index_id;

 

清单1:查询sys.dm_db_index_physical_stats函数结果如图2所示

阅第4级 - 页面和范围。)

技术分享图片

 

 

图2:查询sys.dm_db_index_physical_stats函数的结果相反,清单2中显示的代码请求特定索引的详细信息,即SalesOrderDetail表的表的uniqueidentifier列上的非聚集索引。 它会为每个索引级返回一行,如图3所示。 清单2:查询sys.dm_db_index_physical_stats获取详细信息。

 

SELECT OBJECT_NAME(P.OBJECT_ID) AS ‘Table‘

 

     , I.name AS ‘Index‘

 

     , P.index_id AS ‘IndexID‘

 

     , P.index_type_desc

 

     , P.index_level  

 

     , P.page_count

 

  FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(‘Sales.SalesOrderDetail‘), 2, NULL, ‘DETAILED‘) P

 

  JOIN sys.indexes I ON I.OBJECT_ID = P.OBJECT_ID

 

                    AND I.index_id = P.index_id;

 

图3:查询sys.dm_db_index_physical_stats获取详细信息的结果

技术分享图片

从图3的结果可以看出: ?这个指数的叶级分布在407页。 ?唯一的中间级别只需要两页。 ?根级始终是一个页面。 索引的非叶部分的大小通常是叶级的大小的十分之一至二百分之一;取决于哪些列包括搜索关键字,书签的大小,以及哪些(如果有的话)被包括的列被指定。换句话说,相对而言,指数非常宽泛且很短。这与大多数索引示例图不同,比如图1中的索引示例图,索引图往往比较高而且很窄。 请记住,包含的列仅适用于非聚簇索引,它们只出现在叶级别条目中;它们从较高级别的条目中被省略,这就是为什么它们不添加到非叶级别的大小。 由于聚簇索引的叶级别是该表的数据行,因此只有聚簇索引的非叶子部分是附加信息,需要额外的存储空间。无论索引是否创建,数据行都会存在。因此,创建聚集索引可能需要时间并消耗资源;但是当创建完成时,数据库中消耗的空间很少。 结论 索引的结构使SQL Server能够快速访问特定索引键值的任何条目。一旦找到该条目,SQL Server就可以: ?访问该条目的行。 ?从该点开始以升序或降序的顺序遍历索引。 这种索引树结构已经使用了很长时间,甚至比关系数据库还要长,并且随着时间的推移已经证明了它自己。   本文是SQL Server索引阶梯的一部分

SQL Server索引内部结构:SQL Server索引的阶梯级别10

标签:遍历   employee   获取   导致   集中   过滤   结构   src   span   

人气教程排行