建立非聚集索引.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档