2022年索引原理 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年索引原理 .pdf》由会员分享,可在线阅读,更多相关《2022年索引原理 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、索引原理目录索引原理.1一、数据表的基本结构.2二、索引的基本概念.3三、平衡树.4四、聚集索引和非聚集索引.4五、数据是怎样被访问的.4(一)SQLS怎样访问没有建立任何索引数据表:.4(二)SQLS怎样访问建立了非聚集索引的数据表:.5(三)SQLS怎样访问建立了聚集索引的数据表:.6(四)SQLS怎样访问既有聚集索引、又有非聚集索引的数据表:.6六、索引的优点和不足.7一、页分裂.7二、填充因子.7三、两道数学题.8四、统计信息.8五、索引的人工维护.9六、索引的使用原则.9七、大结局.10 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 11 页 -中小企业MIS 系统的
2、管理基本上由两大部份组成,一是前台的可视化操作,二是后台的数据库管理。网管对前台的管理和维护工作包括保障网络链路通畅、处理MIS 终端的突发事件以及对操作员的管理、培训等,这是网管们日常做得最多、最辛苦的功课;然而MIS 系统架构中同等重要的针对数据库的管理、维护和优化工作,现实中似乎并没有得到网管朋友的足够重视,看起来这都是程序员的事,事实上,一个网管如果能在MIS 设计期间就数据表的规范化、表索引优化、容量设计、事务处理等诸多方面与程序员进行卓有成效的沟通和协作,那么日常的前台管理工作将会变得大为轻松,因为在某种意义上,数据库管理系统就相当于操作系统,在系统中占有同样重要的位置。这正是 S
3、QL SERVER 等数据库管理系统和dBASEX、ACCESS 等数据库文件系统的本质区别,所以,对数据库管理系统操作能力的强弱在某种程度上也折射出了网管的水平个人认为,称得上优秀的Admin,至少应该是一个称职的DBA(数据库管理员)。下面以 SQL SERVER(下称SQLS)为例,将数据库管理中难于理解的“索引原理”问题给各位朋友作一个深入浅出的介绍。其他的数据库管理系统如Oracle、Sybase等,朋友们可以融会贯通,举一反三。一、数据表的基本结构建立数据库的目的是管理大量数据,而建立索引的目的就是提高数据检索效率,改善数据库工作性能,提高数据访问速度。对于索引,我们要知其然,更要
4、知其所以然,关键在于认识索引的工作原理,才能更好的管理索引。为认识索引工作原理,首先有必要对数据表的基本结构作一次全面的复习。SQLS当一个新表被创建之时,系统将在磁盘中分配一段以8K 为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个8K 用完的时候,SQLS指针会自动分配一个8K 的空间。这里,每个8K 空间被称为一个数据页(Page),又名页面或数据页面,并分配从0-7 的页号,每个文件的第0 页记录引导信息,叫文件头(File header);每 8个数据页(64)的组合形成扩展区(Extent),称为扩展。全部数据页的组合形成堆(Heap)。SQLS规定行
5、不能跨越数据页,所以,每行记录的最大数据量只能为8K。这就是 char 和 varchar这两种字符串类型容量要限制在8K 以内的原因,存储超过8K 的数据应使用text 类型,实际上,text 类型的字段值不能直接录入和保存,它只是存储一个指针,指向由若干8K 的文本数据页所组成的扩展区,真正的数据正是放在这些数据页中。页面有空间页面和数据页面之分。当一个扩展区的8 个数据页中既包含了空间页面又包括了数据或索引页面时,称为混合扩展(Mixed Extent),每张表都以混合扩展开始;反之,称为一致扩展(Uniform Extent),专门保存数据及索引信息。表被创建之时,SQLS在混合扩展中
6、为其分配至少一个数据页面,随着数据量的增长,SQLS可即时在混合扩展中分配出7 个页面,当数据超过8 个页面时,则从一致扩展中分配数据页面。空间页面专门负责数据空间的分配和管理,包括:PFS页面(Page free space):记录一个页面是否已分配、位于混合扩展还是一致扩展以及页面上还有多少可用空间等信息;GAM 页面(Global allocation map)和 SGAM页面(Secodary global allocation map):用来记录空闲的扩展或含有空闲页面的混合扩展的位置。SQLS综合利用这三种类型的页面文件在必要时为数据表创建新空间;数据页或索引页则专门保存数据及索引
7、信息,SQLS使用 4 种类型的数据页面来管理表或索名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 11 页 -引:它们是IAM 页、数据页、文本/图像页和索引页。在 WINDOWS 中,我们对文件执行的每一步操作,在磁盘上的物理位置只有系统(system)才知道;SQL SERVER沿袭了这种工作方式,在插入数据的过程中,不但每个字段值在数据页面中的保存位置是随机的,而且每个数据页面在“堆”中的排列位置也只有系统(system)才知道。这是为什么呢?众所周知,OS之所以能管理DISK,是因为在系统启动时首先加载了文件分配表:FAT(File Allocation Table),
8、正是由它管理文件系统并记录对文件的一切操作,系统才得以正常运行;同理,作为管理系统级的SQL SERVER,也有这样一张类似FAT的表存在,它就是索引分布映像页:IAM(Index Allocation Map)。IAM 的存在,使SQLS对数据表的物理管理有了可能。IAM 页从混合扩展中分配,记录了8 个初始页面的位置和该扩展区的位置,每个IAM 页面能管理 512,000 个数据页面,如果数据量太大,SQLS也可以增加更多的IAM 页,可以位于文件的任何位置。第一个IAM 页被称为FirstIAM,其中记录了以后的IAM 页的位置。数据页和文本/图像页互反,前者保存非文本/图像类型的数据,
9、因为它们都不超过8K 的容量,后者则只保存超过8K 容量的文本或图像类型数据。而索引页顾名思义,保存的是与索引结构相关的数据信息。了解页面的问题有助我们下一步准确理解SQLS维护索引的方式,如页拆分、填充因子等。二、索引的基本概念索引是一种特殊类型的数据库对象,它与表有着密切的联系。索引是为检索而存在的。如一些书籍的末尾就专门附有索引,指明了某个关键字在正文中的出现的页码位置,方便我们查找,但大多数的书籍只有目录,目录不是索引,只是书中内容的排序,并不提供真正的检索功能。可见建立索引要单独占用空间;索引也并不是必须要建立的,它们只是为更好、更快的检索和定位关键字而存在。再进一步说,我们要在图书
10、馆中查阅图书,该怎么办呢?图书馆的前台有很多叫做索引卡片柜的小柜子,里面分了若干的类别供我们检索图书,比如你可以用书名的笔画顺序或者拼音顺序作为查找的依据,你还可以从作者名的笔画顺序或拼音顺序去查询想要的图书,反正有许多检索方式,但有一点很明白,书库中的书并没有按照这些卡片柜中的顺序排列虽然理论上可以这样做,事实上,所有图书的脊背上都人工的粘贴了一个特定的编号,它们是以这个顺序在排列。索引卡片中并没有指明这本书摆放在书库中的第几个书架的第几本,仅仅指明了这个特定的编号。管理员则根据这一编号将请求的图书返回到读者手中。这是很形象的例子,以下的讲解将会反复用到它。SQLS在安装完成之后,安装程序会
11、自动创建master、model、tempdb 等几个特殊的系统数据库,其中master 是 SQLS的主数据库,用于保存和管理其它系统数据库、用户数据库以及SQLS的系统信息,它在SQLS中的地位与WINDOWS下的注册表相当。master 中有一个名为sysindexes 的系统表,专门管理索引。SQLS查询数据表的操作都必须用到它,毫无疑义,它是本文主角之一。查看一张表的索引属性,可以在查询分析器中使用以下命令:select*from sysindexes where id=object_id(tablename);而要查看表的索引所占空间的大小,可以使用系统存储过程命令:sp_spac
12、eused tablename,其中参数tablename 为被索引的表名。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 11 页 -三、平衡树如果你通过书后的索引知道了一个关键字所在的页码,你有可能通过随机的翻寻,最终到达正确的页码。但更科学更快捷的方法是:首先把书翻到大概二分之一的位置,如果要找的页码比该页的页码小,就把书向前翻到四分之一处,否则,就把书向后翻到四分之三的地方,依此类推,把书页续分成更小的部分,直至正确的页码。这叫“两分法”,微软在官方教程MOC 里另有一种说法:叫B树(B-Tree,Balance Tree),即平衡树。一个表索引由若干页面组成,这些页面构
13、成了一个树形结构。B树由“根”(root)开始,称为根级节点,它通过指向另外两个页,把一个表的记录从逻辑上分成两个部分:“枝”-非叶级节点(Non-Leaf Level);而非叶级节点又分别指向更小的部分:“叶”叶级节点(Leaf Level)。根节点、非叶级节点和叶级节点都位于索引页中,统称为索引节点,属于索引页的范筹。这些“枝”、“叶”最终指向了具体的数据页(Page)。在根级节点和叶级节点之间的叶又叫数据中间页。“根”(root)对应了sysindexes表的 Root 字段,其中记载了非叶级节点的物理位置(即指针);非叶级节点位于根节点和叶节点之间,记载了指向叶级节点的指针;而叶级节点
14、则最终指向数据页。这就是“平衡树”。四、聚集索引和非聚集索引从形式上而言,索引分为聚集索引(Clustered Indexes)和非聚集索引(NonClustered Indexes)。聚集索引相当于书籍脊背上那个特定的编号。如果对一张表建立了聚集索引,其索引页中就包含着建立索引的列的值(下称索引键值),那么表中的记录将按照该索引键值进行排序。比如,我们如果在“姓名”这一字段上建立了聚集索引,则表中的记录将按照姓名进行排列;如果建立了聚集索引的列是数值类型的,那么记录将按照该键值的数值大小来进行排列。非聚集索引用于指定数据的逻辑顺序,也就是说,表中的数据并没有按照索引键值指定的顺序排列,而仍然
15、按照插入记录时的顺序存放。其索引页中包含着索引键值和它所指向该行记录在数据页中的物理位置,叫做行定位符(RID:Row ID)。好似书后面的的索引表,索引表中的顺序与实际的页码顺序也是不一致的。而且一本书也许有多个索引。比如主题索引和作者索引。SQL Server在默认的情况下建立的索引是非聚集索引,由于非聚集索引不对表中的数据进行重组,而只是存储索引键值并用一个指针指向数据所在的页面。一个表如果没有聚集索引时,理论上可以建立249 个非聚集索引。每个非聚集索引提供访问数据的不同排序顺序。五、数据是怎样被访问的若能真正理解了以上索引的基础知识,那么再回头来看索引的工作原理就简单和轻松多了。(一
16、)SQLS 怎样访问没有建立任何索引数据表:Heap 译成汉语叫做“堆”,其本义暗含杂乱无章、无序的意思,前面提到数据值被写进数据页时,由于每一行记录之间并没地有特定的排列顺序,所以行与行的顺序就是随机无序的,名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 11 页 -当然表中的数据页也就是无序的了,而表中所有数据页就形成了“堆”,可以说,一张没有索引的数据表,就像一个只有书柜而没有索引卡片柜的图书馆,书库里面塞满了一堆乱七八糟的图书。当读者对管理员提交查询请求后,管理员就一头钻进书库,对照查找内容从头开始一架一柜的逐本查找,运气好的话,在第一个书架的第一本书就找到了,运气不好的
17、话,要到最后一个书架的最后一本书才找到。SQLS在接到查询请求的时候,首先会分析sysindexes表中一个叫做索引标志符(INDID:Index ID)的字段的值,如果该值为0,表示这是一张数据表而不是索引表,SQLS就会使用sysindexes表的另一个字段也就是在前面提到过的FirstIAM 值中找到该表的IAM 页链也就是所有数据页集合。这就是对一个没有建立索引的数据表进行数据查找的方式,是不是很没效率?对于没有索引的表,对于一“堆”这样的记录,SQLS也只能这样做,而且更没劲的是,即使在第一行就找到了被查询的记录,SQLS 仍然要从头到尾的将表扫描一次。这种查询称为“遍历”,又叫“表
18、扫描”。可见没有建立索引的数据表照样可以运行,不过这种方法对于小规模的表来说没有什么太大的问题,但要查询海量的数据效率就太低了。(二)SQLS 怎样访问建立了非聚集索引的数据表:如前所述,非聚集索引可以建多个,具有 B 树结构,其叶级节点不包含数据页,只包含索引行。假定一个表中只有非聚集索引,则每个索引行包含了非聚集索引键值以及行定位符(ROW ID,RID),他们指向具有该键值的数据行。每一个RID由文件 ID、页编号和在页中行的编号组成。当 INDID 的值在 2-250 之间时,意味着表中存在非聚集索引页。此时,SQLS调用 ROOT字段的值指向非聚集索引B 树的 ROOT,在其中查找与
19、被查询最相近的值,根据这个值找到在非叶级节点中的页号,然后顺藤摸瓜,在叶级节点相应的页面中找到该值的RID,最后根据这个 RID 在 Heap 中定位所在的页和行并返回到查询端。例如:假定在 Lastname 上建立了非聚集索引,则执行 Select*From Member Where Lastname=Ota时,查询过程是:SQLS查询 INDID 值为 2;立即从根出发,在非叶级节点中定位最接近 Ota 的值“Martin”,并查到其位于叶级页面的第61 页;仅在叶级页面的第61 页的 Martin 下搜寻 Ota 的 RID,其 RID 显示为 N7064,表示 Lastname 字段中
20、名为Ota 的记录位于堆的第707 页的第 4 行,N 表示文件的ID 值,与数据无关;根据上述信息,SQLS立马在堆的第707 页第 4 行将该记录“揪”出来并显示于前台(客户端)。视表的数据量大小,整个查询过程费时从百分之几毫秒到数毫秒不等。在谈到索引基本概念的时候,我们就提到了这种方式:图书馆的前台有很多索引卡片柜,里面分了若干的类别,诸如按照书名笔画或拼音顺序、作者笔画或拼音顺序等等,但不同之处有二:索引卡片上记录了每本书摆放的具体位置位于某柜某架的第几本而不是“特殊编号”;书脊上并没有那个“特殊编号”。管理员在索引柜中查到所需图书的具体位置(RID)后,根据RID 直接在书库中的具体
21、位置将书提出来。显然,这种查询方式效率很高,但资源占用极大,因为书库中书的位置随时在发生变化,必然要求管理员花费额外的精力和时间随时做好索引更新。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 11 页 -(三)SQLS 怎样访问建立了聚集索引的数据表:在聚集索引中,数据所在的数据页是叶级,索引数据所在的索引页是非叶级。查询原理和上述对非聚集索引的查询相似,但由于记录是按照聚集索引中索引键值进行排序,换句话说,聚集索引的索引键值也就是具体的数据页。这就好比书库中的书就是按照书名的拼音在排序,而且也只按照这一种排序方式建立相应的索引卡片,于是查询起来要比上述只建立非聚集索引的方式要
22、简单得多。仍以上面的查询为例:假定在 Lastname 字段上建立了聚集索引,则执行Select*From Member Where Lastname=Ota时,查询过程是:SQLS查询 INDID 值为 1,这是在系统中只建立了聚集索引的标志;立即从根出发,在非叶级节点中定位最接近Ota 的值“Martin”,并查到其位于叶级页面的第 120 页;在位于叶级页面第120 页的 Martin 下搜寻到Ota 条目,而这一条目已是数据记录本身;将该记录返回客户端。这一次的效率比第二种方法更高,以致于看起来更美,然而它最大的优点也恰好是它最大的缺点由于同一张表中同时只能按照一种顺序排列,所以在任何
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年索引原理 2022 索引 原理
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内