`

SQLServer之索引解析

阅读更多

 最近在学习数据库索引,所以在这里记录下最近的学习心得。

 

   热身学习。

     1.二叉平衡树和B树B+树的概念需要了解。

     2.了解二叉平衡树的旋转。

     3.思考为何数据库索引不使用二叉平衡树而选择B树或者B+树。

     4.思考B+树作为索引相对于B树的优点在哪里。

      

        具体可以参考:

                 MySQL索引背后的数据结构及算法原理

                 平衡二叉树_B树严蔚敏老师

 

   知识总结

      1.聚集索引

 

         叶子节点包含聚集键值和全部数据。

 

         表中的数据顺序通过聚集键的顺序来维护,聚集索引树本身就包含了一个表。

                单独的外链双链表来进行页之间的维护。也就是说在每页中是有序的,每个页也是有序的。

 

        思考,那如果页的最后一条数据添加或者删除会有哪些情况?

 

        思考,聚集键值唯一性,宽度,易变性因素对整个索引产生的影响。

                  唯一性在下面的问题中探讨。

                  宽度的影响首先影响本身B树的每个节点的度,其次辅助索叶子节点引用键值的成本增加。

                 易变性使其记录需要重新定位,容易产生页面分离和碎片。其次每个辅助索引需要修改。

 

        思考,通过聚集键找到叶子节点的时候,将叶子节点的页面加载进来的时候是通过二分查找吗?

 

 

  

 

 

     2.非聚集索引

 

       叶子节点存储的是索引键值和【聚集键或者sqlserver生成物理标示符RID】

 

       思考RID是sqlserver自动生成的,还是真实物理地址。?

              真实的物理行号。

 

       思考,为何聚集键值必须唯一。

              假设聚集键值不唯一,聚集键为姓名,非聚集键值为身份证号,如果一个非聚集索引是唯一的如身                 份证号,定位到一个姓名A如果存在多个人姓名为A则更新的是跟新多个人的姓名是不合理的,因为               身份证号是唯一的。

 

       如果聚集键不一定则sqlserver会在必要时添加一个隐藏的唯一标识列来保证内部的唯一性。

 

      思考索引和约束有哪些区别?

             索引会建立真实的物理结构需要维护,而索引则是逻辑上的意义。

 

     3.索引结构

 

 

 

        对于聚簇索引表的聚簇索引结构如下。

         

-- 创建聚簇索引表
create table employee(
	id int not null identity,
	lastname  Nchar(30) not null,
	firstname nchar(29) not null,
	middleinit nchar(1) null,
	ssn char(11) not null,
	othercolumns char(258) not null default 'jack');

alter table employee add constraint  employeePK primary key clustered (id) 

select * from employee

-- 80000条
insert into employee(lastname,firstname,middleinit,ssn,othercolumns) values('','','','','')

-- 查询索引结构
select index_depth as 'Depth'
	  ,index_level as 'Level'
	  ,record_count
	  ,page_count
	  ,avg_page_space_used_in_percent as 'pgPercentFull'
	  ,min_record_size_in_bytes as 'minLen'
	  ,max_record_size_in_bytes as 'maxLen'
	  ,avg_record_size_in_bytes as 'avgLen'
	  from sys.dm_db_index_physical_stats(DB_ID('test'),OBJECT_ID('employee'),1,null,'detailed')

    

 

 

dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])

The filenum and pagenum parameters are taken from the page IDs that come from various system tables and appear in DBCC or other system error messages. A page ID of, say, (1:354) has filenum = 1 and pagenum = 354.

The printopt parameter has the following meanings:

0 - print just the page header
1 - page header plus per-row hex dumps and a dump of the page slot array (unless its a page that doesn't have one, like allocation bitmaps)
2 - page header plus whole page hex dump
3 - page header plus detailed per-row interpretation

database consistenecy checker,简称dbcc
Trace flag 3604 is to print the output in query window. 
	Since you have not given -1 parameter (DBCC TRACEON(6304,-1)), 
	it would be session specific. Once you close the window, it would be cleared. 

 

 

 

--  寻找12345的记录。
--创建临时表
create table temp_table(
	PageFID tinyint,
	pagePID int ,
	IAMFID tinyint,
	IAMPID int,
	objectID int,
	indexID tinyint,
	partitionNumber tinyint,
	partitionID bigint,
	iam_chain_type varchar(30),
	pagetype tinyint,
	indexLevel tinyint,
	nextpageFID tinyint,
	nextpagePID int,
	prePageFID tinyint,
	prepagePID int,
	primary key(PageFID,PagepID)
)

--寻找索引id
select * from sys.sysindexes where name='employeePK'
--查询dbcc ind结果集
--此处需要索引ID
truncate table temp_table
insert temp_table 
	exec ('dbcc ind (test,employee,1)')  




-- 找到根页
select indexLevel,
	   PageFID,
	   pagePID,
	   prePageFID,
	   prepagePID,
	   nextpageFID,
	   nextpagePID
	 from temp_table
		order by indexLevel desc,prepagePID

--查询根页的记录开始B树搜索
--LEVEL 2
dbcc page('test',1,1695,3)

--LEVEL 1
dbcc page('test',1,1966,3)

--LEVEL 0
dbcc traceon(3604)
dbcc page('test',1,1690,3)
 

 

    根据索引名称获取索引ID

 

 


 根据索引ID找到级别2的Root页号 


 

    查询级别2的页内容,定位级别1的页号。

     


根据级别1的页号,查询级别1的内容,定位叶子节点的页号。 

 

 


根据叶子节点的页号,查询叶子节点的内容。 

     

 

 

    

 

 

 

 

 

 

 

 聚簇索引表的非聚簇索引结构。

    

-- 修改原来的聚簇索引表结构
update employee set ssn = CAST(id as char(8))+'ssn'

--添加UK索引
alter table employee add constraint employeeSSNUK unique nonclustered (ssn)

--还是查找12345
-- 查询索引结构  
select index_depth as 'Depth'  
      ,index_level as 'Level'  
      ,record_count  
      ,page_count  
      ,avg_page_space_used_in_percent as 'pgPercentFull'  
      ,min_record_size_in_bytes as 'minLen'  
      ,max_record_size_in_bytes as 'maxLen'  
      ,avg_record_size_in_bytes as 'avgLen'  
      from sys.dm_db_index_physical_stats(DB_ID('test'),OBJECT_ID('employee'),2,null,'detailed')


--寻找索引ID  2
select * from sys.sysindexes where name='employeeSSNUK'

-- 查询结果集
truncate table temp_table
insert temp_table 
	exec ('dbcc ind (test,employee,2)')  
	
-- 找到根页fID,pageID
select indexLevel,
	   PageFID,
	   pagePID,
	   prePageFID,
	   prepagePID,
	   nextpageFID,
	   nextpagePID
	 from temp_table
		order by indexLevel desc,prepagePID

--查询根页内容找到叶子节点的页号
dbcc page('test',1,13216,3)

--查询叶子节点的内容 存储的是聚集键
dbcc traceon(3604)  
dbcc page('test',1,9037,3)  
 

 

    查询索引结构

   

 

查询索引ID

 

寻找根页号需要fID和pageID


 

查询根页内容,根据范围寻找叶子节点的页号。


 

 

 

 查询叶子节点的内容。

 



 

 

 

 

 

关于堆表索引结构

 

--创建堆表
create table employeeHeap(
	id int not null identity,
	lastname  Nchar(30) not null,
	firstname nchar(29) not null,
	middleinit nchar(1) null,
	ssn char(11) not null,
	othercolumns char(258) not null default 'jack');
	
 alter table employeeHeap add constraint employeeHeapPK primary key nonclustered (id)

--查询索引ID
select * from sys.sysindexes where name='employeeHeapPK'

-- 查询索引的结构
select index_depth as 'Depth'
	  ,index_level as 'Level'
	  ,record_count
	  ,page_count
	  ,avg_page_space_used_in_percent as 'pgPercentFull'
	  ,min_record_size_in_bytes as 'minLen'
	  ,max_record_size_in_bytes as 'maxLen'
	  ,avg_record_size_in_bytes as 'avgLen'
	  from sys.dm_db_index_physical_stats(DB_ID('test'),OBJECT_ID('employeeHeap'),3,null,'detailed')
	  
	  
truncate table temp_table
insert temp_table 
	exec ('dbcc ind (test,employeeHeap,3)')  
	
-- 查找12345 步骤
-- 找到根页
select indexLevel,
	   PageFID,
	   pagePID,
	   prePageFID,
	   prepagePID,
	   nextpageFID,
	   nextpagePID
	 from temp_table
		order by indexLevel desc,prepagePID
		
--level 1   7888
dbcc page('test',1,7888,3)

--查看叶节点的内容
dbcc page('test',1,7830,3)

-- 创建解析函数
create function convert_rids (@rid binary(8)) 
	returns varchar(30)
as
	begin
	return (
		convert (varchar(5),
			convert(int,substring(@rid,6,1)
			+substring(@rid,5,1)))
			+':'+
			convert(varchar(10),convert(int,substring(@rid,4,1) +substring(@rid,3,1)+substring(@rid,2,1)+substring(@rid,1,1)))
			+':'+
			convert(varchar(5),convert(int,substring(@rid,8,1)+substring(@rid,7,1)))
		)
	end

--fileID,pageID,slotNum	 解析rid 
select test.dbo.convert_rids(0x5126000001000400)

--查看行的内容
dbcc traceon(3604)    
dbcc page('test',1,9809,3)

	
 

 

    查询索引ID

    

 

  根据索引ID查看索引结构

  

 

 


 根据索引ID获取根页号


 

查看根页的内容获取子节点的fID和pageID


 

 

根据根页提供的pageID查看叶子节点的内容

叶子节点存储的是物理行号,

 

 


 解析行号。


 

 

 

查看行数据。



 
 


 
 


 
 
 

 

 

 

 

 


 

  • 大小: 173.7 KB
  • 大小: 39.2 KB
  • 大小: 86.1 KB
  • 大小: 146.1 KB
  • 大小: 38.2 KB
  • 大小: 23.2 KB
  • 大小: 33.8 KB
  • 大小: 32.3 KB
  • 大小: 41.4 KB
  • 大小: 44.5 KB
  • 大小: 43.2 KB
  • 大小: 33.6 KB
  • 大小: 31.1 KB
  • 大小: 34.6 KB
  • 大小: 36 KB
  • 大小: 41 KB
  • 大小: 21.6 KB
  • 大小: 28.3 KB
分享到:
评论

相关推荐

    SQL SERVER建立索引.pdf

    ### SQL Server 建立索引相关知识点 #### 一、建立索引 索引是在数据库表中的数据列上创建的一种特殊的数据结构,其目的是为了加快数据检索速度。索引类似于书籍的目录,通过索引可以快速定位到所需的数据行,从而...

    Sql Server解析Json

    ### SQL Server 解析 JSON 字符串方法详解 随着 Web 应用和服务的广泛采用,JSON 成为了一种非常流行的轻量级数据交换格式。在 SQL Server 中处理 JSON 数据变得日益重要,尤其是对于那些需要从非结构化数据源提取...

    深入解析sqlserver 2008 Microsoft SQL Server 2008 Internals

    《SQL Server 2008 Internals》是微软技术专家David Campbell作序的一本深入解析Microsoft SQL Server 2008内部机制的专业书籍。由Paul S. Randal、Kimberly L. Tripp、Conor Cunningham、Adam Machanic和Ben ...

    深入解析SQL Server 2008(下)

    书中详细阐述了SQL Server处理查询、管理数据的相关内容,包括SQL Server架构和配置、跟踪/扩展事件、日志和恢复、索引、表格、查询优化、事务/并发以及DBCC。  《深入解析SQL Server 2008》适合中高级数据库开发...

    sqlserver文件格式解析,学习恢复数据学习.zip

    提供的文档“sqlserver文件格式解析,学习恢复数据学习.doc”应该包含了关于.mdf文件的详细解析和数据恢复的具体步骤,包括如何解读文件结构、识别不同类型的页,以及如何应用这些知识来处理实际问题。 7. **注意...

    SQLServer性能优化解析说明

    其中,索引的使用和优化是提升SQL Server性能的关键手段。 聚簇索引(Clustered Indexes)是数据表中的一种特殊索引,它决定了数据在磁盘上的物理排列顺序。由于索引页直接指向数据页,聚簇索引通常能提供更快的...

    详解SQL Server表和索引存储结构

    ### 详解SQL Server表和索引存储结构 #### 一、引言 SQL Server作为一款广泛使用的数据库管理系统,其内部的存储结构对于优化查询性能、提高数据管理效率至关重要。本文将详细探讨SQL Server中表和索引的存储原理...

    SQL Server经典案例解析

    在SQL Server的经典案例解析中,我们通常会遇到各种数据库管理和优化的问题。SQL Server作为一个广泛使用的关系型数据库管理系统,它的功能强大且应用场景广泛。本解析将深入探讨以下几个关键知识点: 1. **查询...

    SQLSERVER日志分析工具

    SQLSERVER日志分析工具是一种专门针对Microsoft SQL Server数据库系统设计的实用软件,旨在帮助数据库管理员和开发者有效地管理和解析SQL Server的日志数据。日志分析在数据库管理中扮演着至关重要的角色,因为它能...

    深入解析SQL Server 2008(上)

    书中详细阐述了SQL Server处理查询、管理数据的相关内容,包括SQL Server架构和配置、跟踪/扩展事件、日志和恢复、索引、表格、查询优化、事务/并发以及DBCC。  《深入解析SQL Server 2008》适合中高级数据库开发...

    SQL server Native Client 10.0

    根据描述,SQL Server Native Client 10.0与SQL Server 2008 R2兼容,这表明它可以处理该版本引入的新特性,如列存储索引、数据压缩、资源Governance等。此外,它还支持高级查询优化、并行数据仓库和改进的备份恢复...

    SQL Server 2005 中的分区表和索引

    ### SQL Server 2005 中的分区表和索引:深入解析 #### 分区的由来与演变 分区的概念在SQL Server的历史中占据着重要地位。从早期的SQL Server版本开始,数据库管理员就意识到,面对不断增长的数据量,传统的单一...

    深入解析SQL Server 2008

    本书全面探讨了sql server 2008的内部工作原理。全书共分为11章,首先在第1章中详细介绍了sql server 2008... 运行dbcc时,sqlserver在内部检查什么  处理多个并发用户时,如何在5个隔离级别和2个并发模型中做出选择

    《Delphi+SQL Server数据库应用实例完全解析》光盘内容

    《Delphi+SQL Server数据库应用实例完全解析》是一本深入探讨如何使用Delphi开发应用程序并与SQL Server数据库进行交互的专业书籍。Delphi是一款强大的Windows应用程序开发工具,以其高效的编译器和直观的RAD(快速...

    SQL Server数据库开发实例解析完整版

    本资源“SQL Server数据库开发实例解析完整版”提供了丰富的实践案例,帮助开发者深入理解并掌握SQL Server的数据库开发技术。以下是根据标题、描述以及压缩包中的文件名称,提炼出的相关知识点: 1. SQL Server...

    SQL Optimizer for SQL Server 10.0.3

    SQL Optimizer for SQL Server 是一款强大的分析工具,它能够解析和比较不同的执行计划,为用户提供最佳的T-SQL查询路径。在SQL Server环境中,T-SQL(Transact-SQL)是用于数据操作的主要语言,而优化T-SQL代码对于...

    Microsoft SQL Server 2008 Internals (PDF 高清版)

    3. **存储引擎**:解析SQL Server如何存储数据,涉及页结构、索引类型及其维护机制。 4. **查询优化器**:详细介绍SQL Server查询优化器的工作原理,包括成本估算模型、执行计划生成等关键过程。 5. **恢复模型与...

    深入解析SQL server 2008中文影印版

    《深入解析SQL Server 2008中文影印版》是一本专为SQL Server初学者和进阶者设计的详细教程。SQL Server 2008是微软公司推出的数据库管理系统,广泛应用于企业级数据存储与管理。这本书全面覆盖了SQL Server 2008的...

    Visual C++ +SQL Server 数据库应用实例完全解析

    本篇文章将深入探讨“Visual C++ + SQL Server 数据库应用实例完全解析”的核心知识点。 **1. Visual C++简介** Visual C++是Microsoft公司开发的一款集成开发环境,主要用于编写Windows平台上的C++应用程序。它...

    Professional Microsoft SQL Server_2016英文原版.7z

    《Professional Microsoft SQL Server 2016》是微软SQL Server 2016技术的权威指南,这本书深入探讨了SQL Server 2016的各种功能和优化策略,旨在帮助IT专业人员更好地理解和利用这一强大的数据库管理系统。...

Global site tag (gtag.js) - Google Analytics