- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
建立非聚集索引.ppt
SQL Server传统索引结构;什么是数据库页面(SQL Server中有好几种页面类型)
什么是B*树(数据结构:B*树 算法:二分查找法)
什么是二分查找法(折半查找法)
什么是堆表
什么是聚集索引表
;
一句话和一个公式
1、数据库里没有绝对地址,只有相对地址
2、8KB*PAGENO=页面地址
;
B树也是一种用于查找的平衡树,但是它不是二叉树。
B树的定义:B树(B-tree)是一种树状数据结构,能够用来存储排序后的数据。这种数据结构能够让查找数据、循序存取、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树,可以拥有多于2个子节点。这种数据结构常被应用在数据库和文件系统的实作上。
B+树
B+树是B树的变体,也是一种多路搜索树
更适合文件索引系统和数据库。
;B+树典型结构
;B*树是B+树的变体,在B+树的非根和非叶子节点再增加指向兄弟的指针,将节点的最低利用率从1/2提高到2/3。
B*树分配新节点的概率比B+树要低,空间使用率更高。
SQL Server的聚集索引和非聚集索引是B*树结构
B*树如下图所示
;PID二分查找法又叫折半查找法
举个栗子
从10个数中查找48这个数
5 10 19 21 31 37 42 48 50 55
5 10 19 21 31 37 42 48 50 55
5 10 19 21 31 37 42 48 50 55
只需要查找3次
如果是顺序查找需要8次
5 10 19 21 31 37 42 48
;两种表页面组织结构
聚集索引和非聚集索引都是B+树结构;堆表;498页面;分配扫描 VS 范围扫描;分配扫描 ;堆表+非聚集索引
研究使用的命令:DBCC IND(库名,表名,格式)
DBCC PAGE(库名,文件编号,页号,格式)
其他研究工具: winhex
;
从DBCC IND命令可以看到非聚集索引有两层(index level)
并且它会读取每个页面的页头
m_prevPage = (1:254) m_nextPage = (1:304)
双向链表:order by
;
root page
--root page
DBCC PAGE([pratice],1,164,3)
;
child page
--child page
DBCC PAGE([pratice],1,250,3)
;
什么是HEAP RID(KEY)
FileID:PageID:SlotNumber
;
HEAP RID(KEY)有啥用?
RID查找(RID lookup)
;
KeyHashValue有啥用?
类似于下面C#线程同步代码
;
include()包含性列索引
msdn:可以将非键列包含在非聚集索引中,以避免超过当前索引大小的限制(最大键列数为16,最大索引键大小为900字节),数据库引擎计算索引键列数或索引键大小时候,不考虑非键列
;
前转指针
1、update in place
2、non update in place
前转指针的存在导致消耗更多IO
;
查看前转指针记录数
SELECT * FROM sys.[dm_db_index_physical_stats](db_id(),OBJECT_ID(Department8),NULL,NULL,NULL)
;
后转指针
记录归位
1、收缩数据文件
2、alter table xx rebuild
;
非聚集索引的查找和扫描过程
;
堆表+非聚集索引执行计划
SELECT [GroupName] FROM [dbo].[Department8] WHERE name= 销售部22
--索引查找
SELECT [GroupName] FROM [dbo].[Department8] WHERE [GroupName]=销售组10
--索引扫描
SELECT [GroupName] FROM [dbo].[Department8] WHERE [DepartmentID]=66
--全表扫描 只扫堆
SELECT [DepartmentID],[ModifiedDate] FROM [dbo].[Department8] WHERE name= 销售部8
--索引查找 RID查找
SELECT * FROM [dbo].[Department8] WHERE [GroupName]=销售组10
--索引扫描 RID查找
;
几个未解决的问题
;
5、万一系统表页面损坏怎么办,表字段表结构
;
6、一条记录跨多个页面?
;
另一个研究工具(只适合于堆表)
USE [pratice]
SELECT TOP 10 %%lockres%% AS
文档评论(0)