文档库 最新最全的文档下载
当前位置:文档库 › 数据库索引原理

数据库索引原理

数据库索引原理
数据库索引原理

数据库索引原理

SQL SERVER(下称 SQLS)为例,将数据库管理中难于理解的“索引原理”问题给各位朋友作一个深入浅出的介绍。其他的数据库管理系统如Oracle、Sybase等,朋友们可以融会贯通,举一反三。

一、数据表的基本结构

建立数据库的目的是管理大量数据,而建立索引的目的就是提高数据检索效率,改善数据库工作性能,提高数据访问速度。对于索引,我们要知其然,更要知其所以然,关键在于认识索引的工作原理,才能更好的管理索引。为认识索引工作原理,首先有必要对数据表的基本结构作一次全面的复习。

SQLS当一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个8K用完的时候,SQLS指针会自动分配一个8K的空间。这里,每个8K空间被称为一个数据页(Page),又名页面或数据页面,并分配从0-7的页号,每个文件的第0页记录引导信息,叫文件头(File header);每8个数据页(64K)的组合形成扩展区(Extent),称为扩展。全部数据页的组合形成堆(Heap)。

SQLS规定行不能跨越数据页,所以,每行记录的最大数据量只能为8K。这就是char和varchar这两种字符串类型容量要限制在8K以内的原因,存储超过8K的数据应使用text类型,实际上,text类型的字段值不能直接录入和保存,它只是存储一个指针,指向由若干8K的文本数据页所组成的扩展区,真正的数据正是放在这些数据页中。页面有空间页面和数据页面之分。

当一个扩展区的8个数据页中既包含了空间页面又包括了数据或索引页面时,称为混合扩展(Mixed Extent),每张表都以混合扩展开始;反之,称为一致扩展(Uniform Extent),专门保存数据及索引信息。

表被创建之时,SQLS在混合扩展中为其分配至少一个数据页面,随着数据量的增长,SQLS可即时在混合扩展中分配出7个页面,当数据超过8个页面时,则从一致扩展中分配数据页面。

空间页面专门负责数据空间的分配和管理,包括:PFS页面(Page free space):记录一个页面是否已分配、位于混合扩展还是一致扩展以及页面上还有多少可用空间等信息;GAM页面(Global allocation map)和SGAM页面(Secodary global allocation map):用来记录空闲的扩展或含有空闲页面的混合扩展的位置。SQLS综合利用这三种类型的页面文件在必要时为数据表创建新空间;

数据页或索引页则专门保存数据及索引信息,SQLS使用4种类型的数据页面来管理表或索引:它们是IAM页、数据页、文本/图像页和索引页。

在WINDOWS中,我们对文件执行的每一步操作,在磁盘上的物理位置只有系统(system)才知道;SQL SERVER沿袭了这种工作方式,在插入数据的过程中,不但每个字段值在数据页面中的保存位置是随机的,而且每个数据页面在“堆”中的排列位置也只有系统(system)才知道。

这是为什么呢?众所周知,OS之所以能管理DISK,是因为在系统启动时首先加载了文件分配表:FAT(File Allocation Table),正是由它管理文件系统并记录对文件的一切操作,系统才得以正常运行;同理,作为管理系统级的SQL SERVER,也有这样一张类似FAT的表存在,它就是索引分布映像页:IAM(Index Allocation Map)。

IAM的存在,使SQLS对数据表的物理管理有了可能。

IAM页从混合扩展中分配,记录了8个初始页面的位置和该扩展区的位置,每个IAM页面能管理512,000个数据页面,如果数据量太大,SQLS也可以增加更多的IAM页,可以位于文件的任何位置。第一个IAM页被称为FirstIAM,其中记录了以后的IAM页的位置。

数据页和文本/图像页互反,前者保存非文本/图像类型的数据,因为它们都不超过8K的容量,后者则只保存超过8K容量的文本或图

像类型数据。而索引页顾名思义,保存的是与索引结构相关的数据信息。了解页面的问题有助我们下一步准确理解SQLS维护索引的

方式,如页拆分、填充因子等。

二、索引的基本概念

索引是一种特殊类型的数据库对象,它与表有着密切的联系。

索引是为检索而存在的。如一些书籍的末尾就专门附有索引,指明了某个关键字在正文中的出现的页码位置,方便我们查找,但大多

数的书籍只有目录,目录不是索引,只是书中内容的排序,并不提供真正的检索功能。可见建立索引要单独占用空间;索引也并不是

必须要建立的,它们只是为更好、更快的检索和定位关键字而存在。

再进一步说,我们要在图书馆中查阅图书,该怎么办呢?图书馆的前台有很多叫做索引卡片柜的小柜子,里面分了若干的类别供我们

检索图书,比如你可以用书名的笔画顺序或者拼音顺序作为查找的依据,你还可以从作者名的笔画顺序或拼音顺序去查询想要的图书,反正有许多检索方式,但有一点很明白,书库中的书并没有按照这些卡片柜中的顺序排列——虽然理论上可以这样做,事实上,所有

图书的脊背上都人工的粘贴了一个特定的编号①,它们是以这个顺序在排列。索引卡片中并没有指明这本书摆放在书库中的第几个书

架的第几本,仅仅指明了这个特定的编号。管理员则根据这一编号将请求的图书返回到读者手中。这是很形象的例子,以下的讲解将

会反复用到它。

SQLS在安装完成之后,安装程序会自动创建master、model、tempdb等几个特殊的系统数据库,其中master是SQLS的主数据库,用于保存和管理其它系统数据库、用户数据库以及SQLS的系统信息,它在SQLS中的地位与WINDOWS下的注册表相当。

master中有一个名为sysindexes的系统表,专门管理索引。SQLS查询数据表的操作都必须用到它,毫无疑义,它是本文主角之一。

查看一张表的索引属性,可以在查询分析器中使用以下命令:select * from sysindexes where id=object_id(…tablename?);而要查看表

的索引所占空间的大小,可以使用系统存储过程命令:sp_spaceused tablename,其中参数tablename为被索引的表名。

三、平衡树

如果你通过书后的索引知道了一个关键字所在的页码,你有可能通过随机的翻寻,最终到达正确的页码。但更科学更快捷的方法是:

首先把书翻到大概二分之一的位置,如果要找的页码比该页的页码小,就把书向前翻到四分之一处,否则,就把书向后翻到四分之三

的地方,依此类推,把书页续分成更小的部分,直至正确的页码。这叫“两分法”,微软在官方教程MOC里另有一种说法:叫B树

(B-Tree,Balance Tree),即平衡树。

一个表索引由若干页面组成,这些页面构成了一个树形结构。B树由“根”(root)开始,称为根级节点,它通过指向另外两个页,把一

个表的记录从逻辑上分成两个部分:“枝”—--非叶级节点(Non-Leaf Level);而非叶级节点又分别指向更小的部分:“叶”——叶级节

点(Leaf Level)。根节点、非叶级节点和叶级节点都位于索引页中,统称为索引节点,属于索引页的范筹。这些“枝”、“叶”最终指向

了具体的数据页(Page)。在根级节点和叶级节点之间的叶又叫数据中间页。

“根”(root)对应了sysindexes表的Root字段,其中记载了非叶级节点的物理位置(即指针);非叶级节点位于根节点和叶节点之间,记载了指向叶级节点的指针;而叶级节点则最终指向数据页。这就是“平衡树”。

四、聚集索引和非聚集索引

从形式上而言,索引分为聚集索引(Clustered Indexes)和非聚集索引(NonClustered Indexes)。

聚集索引相当于书籍脊背上那个特定的编号。如果对一张表建立了聚集索引,其索引页中就包含着建立索引的列的值(下称索引键值),那么表中的记录将按照该索引键值进行排序。比如,我们如果在“姓名”这一字段上建立了聚集索引,则表中的记录将按照姓名

进行排列;如果建立了聚集索引的列是数值类型的,那么记录将按照该键值的数值大小来进行排列。

非聚集索引用于指定数据的逻辑顺序,也就是说,表中的数据并没有按照索引键值指定的顺序排列,而仍然按照插入记录时的顺序存放。其索引页中包含着索引键值和它所指向该行记录在数据页中的物理位置,叫做行定位符(RID:Row ID)。好似书后面的的索引表,索引表中的顺序与实际的页码顺序也是不一致的。而且一本书也许有多个索引。比如主题索引和作者索引。

SQL Server在默认的情况下建立的索引是非聚集索引,由于非聚集索引不对表中的数据进行重组,而只是存储索引键值并用一个指针指向数据所在的页面。一个表如果没有聚集索引时,理论上可以建立249个非聚集索引。每个非聚集索引提供访问数据的不同排序顺序。

五、数据是怎样被访问的

若能真正理解了以上索引的基础知识,那么再回头来看索引的工作原理就简单和轻松多了。

(一)SQLS怎样访问没有建立任何索引数据表:

Heap译成汉语叫做“堆”,其本义暗含杂乱无章、无序的意思,前面提到数据值被写进数据页时,由于每一行记录之间并没地有特定的

排列顺序,所以行与行的顺序就是随机无序的,当然表中的数据页也就是无序的了,而表中所有数据页就形成了“堆”,可以说,一张

没有索引的数据表,就像一个只有书柜而没有索引卡片柜的图书馆,书库里面塞满了一堆乱七八糟的图书。当读者对管理员提交查询

请求后,管理员就一头钻进书库,对照查找内容从头开始一架一柜的逐本查找,运气好的话,在第一个书架的第一本书就找到了,运

气不好的话,要到最后一个书架的最后一本书才找到。

SQLS在接到查询请求的时候,首先会分析sysindexes表中一个叫做索引标志符(INDID: Index ID)的字段的值,如果该值为0,表示

这是一张数据表而不是索引表,SQLS就会使用sysindexes表的另一个字段——也就是在前面提到过的FirstIAM值中找到该表的

IAM页链——也就是所有数据页集合。

这就是对一个没有建立索引的数据表进行数据查找的方式,是不是很没效率?对于没有索引的表,对于一“堆”这样的记录,SQLS也

只能这样做,而且更没劲的是,即使在第一行就找到了被查询的记录,SQLS仍然要从头到尾的将表扫描一次。这种查询称为“遍历”,又叫“表扫描”。

可见没有建立索引的数据表照样可以运行,不过这种方法对于小规模的表来说没有什么太大的问题,但要查询海量的数据效率就太低了。

(二)SQLS怎样访问建立了非聚集索引的数据表:

如前所述,非聚集索引可以建多个,具有B树结构,其叶级节点不包含数据页,只包含索引行。假定一个表中只有非聚集索引,则每个索引行包含了非聚集索引键值以及行定位符(ROW ID,RID),他们指向具有该键值的数据行。每一个RID由文件ID、页编号和在页

中行的编号组成。

当INDID的值在2-250之间时,意味着表中存在非聚集索引页。此时,SQLS调用ROOT字段的值指向非聚集索引B树的ROOT,

在其中查找与被查询最相近的值,根据这个值找到在非叶级节点中的页号,然后顺藤摸瓜,在叶级节点相应的页面中找到该值的RID,最后根据这个RID在Heap中定位所在的页和行并返回到查询端。

例如:假定在Lastname上建立了非聚集索引,则执行Select * From Member Where Lastname=?Ota?时,查询过程是:①SQLS查

询INDID值为2;②立即从根出发,在非叶级节点中定位最接近Ota的值“Martin”,并查到其位于叶级页面的第61页;③仅在叶级页

面的第61页的Martin下搜寻Ota的RID,其RID显示为N∶706∶4,表示Lastname字段中名为Ota的记录位于堆的第707页的第4行,N表示文件的ID值,与数据无关;④根据上述信息,SQLS立马在堆的第 707页第4行将该记录“揪”出来并显示于前台(客户端)。视表的数据量大小,整个查询过程费时从百分之几毫秒到数毫秒不等。

在谈到索引基本概念的时候,我们就提到了这种方式:

图书馆的前台有很多索引卡片柜,里面分了若干的类别,诸如按照书名笔画或拼音顺序、作者笔画或拼音顺序等等,但不同之处有二:①索引卡片上记录了每本书摆放的具体位置——位于某柜某架的第几本——而不是“特殊编号”;②书脊上并没有那个“特殊编号”。管理

员在索引柜中查到所需图书的具体位置(RID)后,根据RID直接在书库中的具体位置将书提出来。

显然,这种查询方式效率很高,但资源占用极大,因为书库中书的位置随时在发生变化,必然要求管理员花费额外的精力和时间随时

做好索引更新。

(三)SQLS怎样访问建立了聚集索引的数据表:

在聚集索引中,数据所在的数据页是叶级,索引数据所在的索引页是非叶级。

查询原理和上述对非聚集索引的查询相似,但由于记录是按照聚集索引中索引键值进行排序,换句话说,聚集索引的索引键值也就是

具体的数据页。

这就好比书库中的书就是按照书名的拼音在排序,而且也只按照这一种排序方式建立相应的索引卡片,于是查询起来要比上述只建立

非聚集索引的方式要简单得多。仍以上面的查询为例:

假定在Lastname字段上建立了聚集索引,则执行Select * From Member Where Lastname=?Ota?时,查询过程是:①SQLS查询INDID值为1,这是在系统中只建立了聚集索引的标志;②立即从根出发,在非叶级节点中定位最接近Ota的值“Martin”,并查到其位

于叶级页面的第120页;③在位于叶级页面第120页的Martin下搜寻到Ota条目,而这一条目已是数据记录本身;④将该记录返回

客户端。

这一次的效率比第二种方法更高,以致于看起来更美,然而它最大的优点也恰好是它最大的缺点——由于同一张表中同时只能按照一

种顺序排列,所以在任何一种数据表中的聚集索引只能建立一个;并且建立聚集索引需要至少相当于源表120%的附加空间,以存放

源表的副本和索引中间页!

难道鱼和熊掌就不能兼顾了吗?办法是有的。

(四)SQLS怎样访问既有聚集索引、又有非聚集索引的数据表:

如果我们在建立非聚集索引之前先建立了聚集索引的话,那么非聚集索引就可以使用聚集索引的关键字进行检索,就像在图书馆中,前台卡片柜中的可以有不同类别的图书索引卡,然而每张卡片上都载明了那个特殊编号——并不是书籍存放的具体位置。这样在最大程度上既照顾了数据检索的快捷性,又使索引的日常维护变得更加可行,这是最为科学的检索方法。

也就是说,在只建立了非聚集索引的情况下,每个叶级节点指明了记录的行定位符(RID);而在既有聚集索引又有非聚集索引的情况下,每个叶级节点所指向的是该聚集索引的索引键值,即数据记录本身。

假设聚集索引建立在Lastname上,而非聚集索引建立在Firstname上,当执行Select * From Member Where Firstname=?Mike?时,查询过程是:①SQLS查询INDID值为2;②立即从根出发,在Firstname的非聚集索引的非叶级节点中定位最接近Mike的值“Jose”条目;③从Jose条目下的叶级页面中查到Mike逻辑位置——不是RID而是聚集索引的指针;④根据这一指针所指示位置,直接进入位于Lastname的聚集索引中的叶级页面中到达Mike数据记录本身;⑤将该记录返回客户端。

这就完全和我们在“索引的基本概念”中讲到的现实场景完全一样了,当数据发生更新的时候,SQLS只负责对聚集索引的健值驾以维护,而不必考虑非聚集索引,只要我们在ID类的字段上建立聚集索引,而在其它经常需要查询的字段上建立非聚集索引,通过这种科学的、有针对性的在一张表上分别建立聚集索引和非聚集索引的方法,我们既享受了索引带来的灵活与快捷,又相对规避了维护索引所导致的大量的额外资源消耗。

六、索引的优点和不足

索引有一些先天不足:1:建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引。2:更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性——这就如同图书馆要有专门的位置来摆放索引柜,并且每当库存图书发生变化时都需要有人将索引卡片重整以保持索引与库存的一致。

当然建立索引的优点也是显而易见的:在海量数据的情况下,如果合理的建立了索引,则会大大加强SQLS执行查询、对结果进行排序、分组的操作效率。

实践表明,不恰当的索引不但于事无补,反而会降低系统性能。因为大量的索引在进行插入、修改和删除操作时比没有索引花费更多的系统时间。比如在如下字段建立索引应该是不恰当的:1、很少或从不引用的字段;2、逻辑型的字段,如男或女(是或否)等。

综上所述,提高查询效率是以消耗一定的系统资源为代价的,索引不能盲目的建立,必须要有统筹的规划,一定要在“加快查询速度”与“降低修改速度”之间做好平衡,有得必有失,此消则彼长。这是考验一个DBA是否优秀的很重要的指标。

至此,我们一直在说SQLS在维护索引时要消耗系统资源,那么SQLS维护索引时究竟消耗了什么资源?会产生哪些问题?究竟应该才能优化字段的索引?

在上篇中,我们就索引的基本概念和数据查询原理作了详细阐述,知道了建立索引时一定要在“加快查询速度”与“降低修改速度”之间做好平衡,有得必有失,此消则彼长。那么,SQLS维护索引时究竟怎样消耗资源?应该从哪些方面对索引进行管理与优化?以下就从七个方面来回答这些问题。

一、页分裂

微软MOC教导我们:当一个数据页达到了8K容量,如果此时发生插入或更新数据的操作,将导致页的分裂(又名页拆分):

1、有聚集索引的情况下:聚集索引将被插入和更新的行指向特定的页,该页由聚集索引关键字决定;

2、只有堆的情况下:只要有空间就可以插入新的行,但是如果我们对行数据的更新需要更多的空间,以致大于了当前页的可用空间,行就被移到新的页中,并且在原位置留下一个转发指针,指向被移动的新行,如果具有转发指针的行又被移动了,那么原来的指针将

重新指向新的位置;

3、如果堆中有非聚集索引,那么尽管插入和更新操作在堆中不会发生页分裂,但是在非聚集索引上仍然产生页分裂。

无论有无索引,大约一半的数据将保留在老页面,而另一半将放入新页面,并且新页面可能被分配到任何可用的页。所以,频繁页分裂,后果很严重,将使物理表产生大量数据碎片,导致直接造成I/O效率的急剧下降,最后,停止SQLS的运行并重建索引将是我们

的唯一选择!

二、填充因子

然而在“混沌之初”,就可以在一定程度上避免不愉快出现:在创建索引时,可以为这个索引指定一个填充因子,以便在索引的每个叶

级页面上保留一定百分比的空间,将来数据可以进行扩充和减少页分裂。填充因子是从0到100的百分比数值,设为100时表示将数

据页填满。只有当不会对数据进行更改时(例如只读表中)才用此设置。值越小则数据页上的空闲空间越大,这样可以减少在索引增长

过程中进行页分裂的需要,但这一操作需要占用更多的硬盘空间。

填充因子只在创建索引时执行,索引创建以后,当表中进行数据的添加、删除或更新时,是不会保持填充因子的,如果想在数据页上

保持额外的空间,则有悖于使用填充因子的本意,因为随着数据的输入,SQLS必须在每个页上进行页拆分,以保持填充因子指定的

空闲空间。因此,只有在表中的数据进行了较大的变动,才可以填充数据页的空闲空间。这时,可以从容的重建索引,重新指定填充

因子,重新分布数据。

反之,填充因子指定不当,就会降低数据库的读取性能,其降低量与填充因子设置值成反比。例如,当填充因子的值为50时,数据

库的读取性能会降低两倍!所以,只有在表中根据现有数据创建新索引,并且可以预见将来会对这些数据进行哪些更改时,设置填充

因子才有意义。

三、两道数学题

假定数据库设计没有问题,那么是否象上篇中分析的那样,当你建立了众多的索引,在查询工作中SQLS就只能按照“最高指示”用索

引处理每一个提交的查询呢?答案是否定的!

上篇“数据是怎样被访问的”章节中提到的四种索引方案只是一种静态的、标准的和理论上的分析比较,实际上,将在外,军令有所不从,SQLS几乎完全是“自主”的决定是否使用索引或使用哪一个索引!

这是怎么回事呢?

让我们先来算一道题:如果某表的一条记录在磁盘上占用1000字节(1K)的话,我们对其中10字节的一个字段建立索引,那么该记录

对应的索引大小只有10字节(0.01K)。上篇说过,SQLS的最小空间分配单元是“页(Page)”,一个页面在磁盘上占用8K空间,所以一页只能存储8条“记录”,但可以存储800条“索引”。现在我们要从一个有8000条记录的表中检索符合某个条件的记录(有Where子句),如果没有索引的话,我们需要遍历8000条×1000字节/8K字节=1000个页面才能够找到结果。如果在检索字段上有上述索引的话,那么我们可以在8000条×10字节/8K字节=10个页面中就检索到满足条件的索引块,然后根据索引块上的指针逐一找到结果数据块,这样I/O访问量肯定要少得多。

然而有时用索引还不如不用索引快!

同上,如果要无条件检索全部记录(不用Where子句),不用索引的话,需要访问8000条×1000字节/8K字节=1000个页面;而使用

索引的话,首先检索索引,访问8000条×10字节/8K字节=10个页面得到索引检索结果,再根据索引检索结果去对应数据页面,由于

是检索全部数据,所以需要再访问8000条×1000字节/8K字节=1000个页面将全部数据读取出来,一共访问了1010个页面,这显然

不如不用索引快。

SQLS内部有一套完整的数据索引优化技术,在上述情况下,SQLS会自动使用表扫描的方式检索数据而不会使用任何索引。那么SQLS是怎么知道什么时候用索引,什么时候不用索引的呢?因为SQLS除了维护数据信息外,还维护着数据统计信息!

四、统计信息

打开企业管理器,单击“Database”节点,右击Northwind数据库→单击“属性”→选择“Options”选项卡,观察“Settings”下的各项复选项,你发现了什么?

从Settings中我们可以看到,在数据库中,SQLS将默认的自动创建和更新统计信息,这些统计信息包括数据密度和分布信息,正是

它们帮助SQLS确定最佳的查询策略:建立查询计划和是否使用索引以及使用什么样的索引。

在创建索引时,SQLS会创建分布数据页来存放有关索引的两种统计信息:分布表和密度表。查询优化器使用这些统计信息估算使用

该索引进行查询的成本(Cost),并在此基础上判断该索引对某个特定查询是否有用。

随着表中的数据发生变化,SQLS自动定期更新这些统计信息。采样是在各个数据页上随机进行。从磁盘读取一个数据页后,该数据

页上的所有行都被用来更新统计信息。统计信息更新的频率取决于字段或索引中的数据量以及数据更改量。比如,对于有一万条记录

的表,当1000个索引键值发生改变时,该表的统计信息便可能需要更新,因为1000个值在该表中占了10%,这是一个很大的比例。而对于有1千万条记录的表来说,1000个索引值发生更改的意义则可以忽略不计,因此统计信息就不会自动更新。

至于它们帮助SQLS建立查询计划的具体过程,限于篇幅,这里就省略了,请有兴趣的朋友们自己研究。

顺便多说一句,SQLS除了能自动记录统计信息之外,还可以记录服务器中所发生的其它活动的详细信息,包括I/O统计信息、

CPU 统计信息、锁定请求、T-SQL和 RPC 统计信息、索引和表扫描、警告和引发的错误、数据库对象的创建/除去、连接/断开、存

储过程操作、游标操作等等。这些信息的读取、设置请朋友们在SQLS联机帮助文档(SQL Server Books Online)中搜索字符串“Profiler”查找。

五、索引的人工维护

上面讲到,某些不合适的索引将影响到SQLS的性能,随着应用系统的运行,数据不断地发生变化,当数据变化达到某一个程度时将会影响

到索引的使用。这时需要用户自己来维护索引。

随着数据行的插入、删除和数据页的分裂,有些索引页可能只包含几页数据,另外应用在执行大量I/O的时候,重建非聚聚集索引可

以维护I/O的效率。重建索引实质上是重新组织B树。需要重建索引的情况有:

1) 数据和使用模式大幅度变化;

2)排序的顺序发生改变;

3)要进行大量插入操作或已经完成;

4)使用I/O查询的磁盘读次数比预料的要多;

5)由于大量数据修改,使得数据页和索引页没有充分使用而导致空间的使用超出估算;

6)dbcc检查出索引有问题。

六、索引的使用原则

接近尾声的时候,让我们再从另一个角度认识索引的两个重要属性----唯一性索引和复合性索引。

在设计表的时候,可以对字段值进行某些限制,比如可以对字段进行主键约束或唯一性约束。

主键约束是指定某个或多个字段不允许重复,用于防止表中出现两条完全相同的记录,这样的字段称为主键,每张表都可以建立并且

只能建立一个主键,构成主键的字段不允许空值。例如职员表中“身份证号”字段或成绩表中“学号、课程编号”字段组合。

而唯一性约束与主键约束类似,区别只在于构成唯一性约束的字段允许出现空值。

建立在主键约束和唯一性约束上的索引,由于其字段值具有唯一性,于是我们将这种索引叫做“唯一性索引”,如果这个唯一性索引是

由两个以上字段的组合建立的,那么它又叫“复合性索引”。

注意,唯一索引不是聚集索引,如果对一个字段建立了唯一索引,你仅仅不能向这个字段输入重复的值。并不妨碍你可以对其它类型

的字段也建立一个唯一性索引,它们可以是聚集的,也可以是非聚集的。

唯一性索引保证在索引列中的全部数据是唯一的,不会包含冗余数据。如果表中已经有一个主键约束或者唯一性约束,那么当创建表

或者修改表时,SQLS自动创建一个唯一性索引。但出于必须保证唯一性,那么应该创建主键约束或者唯一性键约束,而不是创建一

个唯一性索引。当创建唯一性索引时,应该认真考虑这些规则:当在表中创建主键约束或者唯一性键约束时, SQLS钭自动创建一个

唯一性索引;如果表中已经包含有数据,那么当创建索引时,SQLS检查表中已有数据的冗余性,如果发现冗余值,那么SQLS就取

消该语句的执行,并且返回一个错误消息,确保表中的每一行数据都有一个唯一值。

复合索引就是一个索引创建在两个列或者多个列上。在搜索时,当两个或者多个列作为一个关键值时,最好在这些列上创建复合索引。当创建复合索引时,应该考虑这些规则:最多可以把16个列合并成一个单独的复合索引,构成复合索引的列的总长度不能超过900

字节,也就是说复合列的长度不能太长;在复合索引中,所有的列必须来自同一个表中,不能跨表建立复合列;在复合索引中,列的

排列顺序是非常重要的,原则上,应该首先定义最唯一的列,例如在(COL1,COL2)上的索引与在(COL2,COL1)上的索引是不相同的,因为两个索引的列的顺序不同;为了使查询优化器使用复合索引,查询语句中的WHERE子句必须参考复合索引中第一个列;当表中有多个关键列时,复合索引是非常有用的;使用复合索引可以提高查询性能,减少在一个表中所创建的索引数量。

综上所述,我们总结了如下索引使用原则:

1)逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引。考虑数据库的

空间有多大,表如何进行访问,还有这些访问是否主要用作读写。

2)不要索引memo/note字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。

3)不要索引常用的小型表

4)一般不要为小型数据表设置过多的索引,假如它们经常有插入和删除操作就更别这样作了,SQLS对这些插入和删除操作提供的索

引维护可能比扫描表空间消耗更多的时间。

七、大结局

查询是一个物理过程,表面上是SQLS在东跑西跑,其实真正大部分压马路的工作是由磁盘输入输出系统(I/O)完成,全表扫描需要从

磁盘上读表的每一个数据页,如果有索引指向数据值,则I/O读几次磁盘就可以了。但是,在随时发生的增、删、改操作中,索引的

存在会大大增加工作量,因此,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生

最佳的优化方案。

一般来说建立索引的思路是:

(1)主键时常作为where子句的条件,应在表的主键列上建立聚聚集索引,尤其当经常用它作为连接的时候。

(2)有大量重复值且经常有范围查询和排序、分组发生的列,或者非常频繁地被访问的列,可考虑建立聚聚集索引。

(3)经常同时存取多列,且每列都含有重复值可考虑建立复合索引来覆盖一个或一组查询,并把查询引用最频繁的列作为前导列,如果

可能尽量使关键查询形成覆盖查询。

(4)如果知道索引键的所有值都是唯一的,那么确保把索引定义成唯一索引。

(5)在一个经常做插入操作的表上建索引时,使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在只读表

上建索引,则可以把fillfactor置为100。

(6)在选择索引字段时,尽量选择那些小数据类型的字段作为索引键,以使每个索引页能够容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必须遍历的索引页面降到最小。此外,尽可能地使用整数为键值,因为它能够提供比任何数据类型都快的访问速度。

SQLS是一个很复杂的系统,让索引以及查询背后的东西真相大白,可以帮助我们更为深刻的了解我们的系统。一句话,索引就象盐,少则无味多则咸。

2013电大数据库原理与应用作业答案3

一、单项选择题(共20 道试题,共40 分。) 1. 在T-SQL语法中,Select语句的完整语法较复杂,但至少包括的部分为()。 A. Select,Into B. Select,From C. Select,Group D. 仅Select 2. 下列()统计函数可以计算平均值。 A. Sum B. Avg C. Count D. Min 3. 下列叙述中不是视图的特点的是()。 A. 为用户集中数据 B. 降低数据库设计的复杂性 C. 存储数据 D. 组织数据以便导出到其他应用程序中 4. ()必须确保索引键不包含重复的值。 A. 聚集索引 B. 非聚集索引 C. 索引视图 D. 唯一索引 5. 对于Update语句的实现说法正确的是()。 A. Update一次只能修改一列的值 B. Update只能修改不能赋值 C. Update可以指定要修改的列和赋予的新值

D. Update不能加Where条件 6. T-SQL对标准SQL的扩展主要表现为()。 A. 加入了程序控制结构和变量 B. 加入了建库和建表语句 C. 提供了分组(Group by)查询功能 D. 提供了Min、Max等统计函数 7. SQL Server的字符型系统数据类型主要包括()。 A. Int、Money、Char B. Char、Varchar、Text C. Datetime、Binary、Int D. Char、Varchar、Int 8. 在T-SQL语法中,用来插入数据的命令和用于更新的命令分别是()。 A. Insert,Update B. Update,Insert C. Delete,Update D. Create,Insert Into 9. 执行哪一个系统存储过程,可以查看视图的定义信息()。 A. sp_helptext B. sp_depends C. sp_help D. sp_rename 10. 下列的SQL语句中,()不是数据定义语句。 A. Create Table B. Drop View C. Create View

数据库原理索引、视图的定义实验报告

数据库原理实验报告 题目:索引、视图的定义院系:计算机科学与工程学院

【实验题目】 索引、视图的定义 【实验目的】 掌握使用T -SQL语句创建视图的方法,包括视图的建立、删除、修改;了解如何应用视图有选择地查看所需数据,并熟悉通过视图更改数据表中数据的方法。掌握创建索引的方法。 【实验内容】 1、据库TestDB中,基于表"项目数据表"和"员工数据表"创建视图,要求为: (1)视图名为"员工项目"。 (2)包含字段"编号"、"姓名"、"名称"和"开始日期"。 (3)字段别名分别是"员工编号"、”员工姓名"、"项目名称"、"项目开 始日期"。 2、使用企业管理器和Transact-SQL语句在实验二的数据表"员工数据表"中基于"姓名"创建索引,要求索引名为"IDX_Name",索引类型为非聚集索引。 【实现方法】 1、视图 (1)打开查询分析器。 在查询窗口书写CREATE VIEW语句创建视图,并指定字段别名: USE TestDB GO CREATE VIEW员工项目(员工编号,员工姓名,项目名称,项目开始日期) AS SELECT a·编号,a·姓名,b·名称,b·开始日期, FROM员工数据表AS a INNER JOIN项目数据表AS b ON a·编号=b·负责人 WHERE a·编号=b·负责人 GO (2)使用INSERT语句通过视图向员工数据表中添加一条记录,要求"姓名"字段值 为"马中兴"。 USETestDB GO INSERTINTO 员工项目(员工姓名) VALUES('马中兴') GO (3)使用UPPDATE语句通过视图将第二步中插入记录的员工姓名改为"马中新"。 USETestDB GO UPDATE员工项目 SET 项目负责人= '马中新’, WHERE 项目负责人=’马中兴’

Oracle索引原理

Oracle数据库中的索引详解 一、ROWID的概念 存储了row在数据文件中的具体位置:64位编码的数据,A-Z, a-z, 0-9, +, 和/,row在数据块中的存储方式 SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20; 比如:OOOOOOFFFBBBBBBRRR OOOOOO:data object number, 对应dba_objects.data_object_id FFF:file#, 对应v$datafile.file# BBBBBB:block# RRR:row# Dbms_rowid包 SELECT dbms_rowid.rowid_block_number('AAAGFqAABAAAIWEAAA') from dual; 具体到特定的物理文件 二、索引的概念 1、类似书的目录结构 2、Oracle 的“索引”对象,与表关联的可选对象,提高SQL查询语句的速度 3、索引直接指向包含所查询值的行的位置,减少磁盘I/O 4、与所索引的表是相互独立的物理结构 5、Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引 6、语法:CREA TE INDEX index ON table (column[, column]...); 7、B-tree结构(非bitmap): [一]了解索引的工作原理: 表:emp

目标:查询Frank的工资salary 建立索引:create index emp_name_idx on emp(name);

[试验]测试索引的作用: 1. 运行/rdbms/admin/utlxplan 脚本 2. 建立测试表 create table t as select * from dba_objects; insert into t select * from t; create table indextable as select rownum id,owner,object_name,subobject_name, object_id,data_object_id,object_type,created from t; 3. set autotrace trace explain 4. set timing on 5. 分析表,可以得到cost 6. 查询object_name=’DBA_INDEXES’ 7. 在object_name列上建立索引 8. 再查询 [思考]索引的代价: 插入,更新 三、唯一索引 1、何时创建:当某列任意两行的值都不相同 2、当建立Primary Key(主键)或者Unique constraint(唯一约束)时,唯一索引将被自动建立 3、语法:CREA TE UNIQUE INDEX index ON table (column); 4、演示

文摘索引型数据库和全文数据库区别

通过对文摘索引型数据库和全文数据库的现状进行比较, 总结出两类数据库的相同和不同特征 两类数据库检索系统的相同特征 1,网络检索 无论是国外引进还是国内购置及自我开发,网络版数据库检索。网络检索方式有很多优势优势,读者可直接在任意具有权限的连接的计算机上利用通用的浏览器便捷地检索。可同时检索同一若干年代的累积数据或相关数据库的相关数据。 2,资源整合和集成检索 用户可以在同一平台上跨库检索,读者可在多个数据库的基础上跨库检索。 3,融菜单检索和高级检索于一体 文摘索引型和全文数据库都是直接面对大众读者,所以都能提供简单的菜单式检索,读者通过点击和选择菜单命令和利用检索窗口的功能键或功能词实现简单的检索。为了读者解决对复杂一点的检索往往无能为力的情况,两类数据库一般都提供了高级检索形式来实现。4,综合运用布尔检索、截词检索和位置检索等检索技术,这些传统检索技术功能就是在文摘索引型数据库检索基础上发展起来的。 5数据库检索人性化,用户无论是普通读者还是非专业人士,对检索界面、检索过程、检索帮助、个性检索、结果输出等方面一目了然。 两类数据库检索系统的不同特征 文摘索引型数据库和全文数据库的最大差别就是前者结果只提供题录和文摘等二次文献信息,后者除可提供二次文献信息外,还能提供作者原文的一次文献信息。 1,检索途径存在着差异 检索途径有主题,分类及除此之外的作者、号码等其它辅助途径, 通过数据库设置的检索字段反映检索途径的实现。不同的数据库根据检索的实际需要设置检索字段。全文数据库设置的检索字段一般较文摘索引型数据库少 2,收录文献的原则和目的不同,数据库所起的作用不同。文摘索引型数据库一般收录特定时期的综合学科领域或某一学科分支的相同或不同出版类型的文献。文摘索引型数据库能反映某一段时间内某一学科某一领域的理论和方法的进展及技术与手段的应用。全文数据库以为用户提供利用一次文献为主要宗旨,其数据库商必须和着者或出版单位商谈着作使用权问题,只有双方达成协议签署合同,并履约支付着作权报酬才能使用文献原文而收录数据库。因此全文数据库不可能存在收录文献全面性问题。相对而言,全文数据库很难像文摘索引数据库那样从宏观上反映某一学科某一领域的学术进展情况, 更不可能充当学术评价的工具。 3 ,检索技术的运用不尽相同 检索原理的不同,文摘索引型数据库是以记录组织文献, 处理每一条记录依据基于文献内容的特征属性和文献外表的特征,体现传统的布尔检索、截词检索和位置检索等功能。全文数据库主要通过运用对整个文本信息的分析,利用将全部文本划分为主题紧凑的不同子段,用不同的关键字特征标注各子段的文本切分技术和计算机自动进行全文自动抽词标引来处理原始文献的。全文检索技术能体现关键词在子段和全文出现的频率和分布,处理的是典型的非结构化的非线性的数据。 4,主题检索特征不同 文摘索引型数据库在提供自然语言的同时,一般都有自己的主题词表反映数据库中各检索词之间的关系,依据主题词表对文献进行主题标引,对每篇文献给出若干个主题词。全文数据库一般没有自己的主题词表, 主题检索依靠不加规范的自然语言实现。使用自然语言主要是基于检索最终用户的大众化, 最大好处就是避免了人工标引的随意性、繁琐性,提高了处理数

数据库原理实验报告-实验四-视图与索引

《数据库原理》实验报告 题目:实验四视图与索引学号班级日期 2016.10.20 一、实验内容、步骤以及结果 1.在Student数据库中,利用图形用户界面,创建一个选修了“数据库原理”课程并且是1996年出生的学生的视图,视图中包括学号,性别,成绩三个信息。(5分) 2.用两种不同的SQL语句创建第五版教材第三章第9题中要求的视图(视图名:V_SPJ)(10分,每种方法5分)。 --第一种方法 CREATE VIEW V_SPJ AS SELECT sno,pno,qty FROM SPJ WHERE jno=( SELECT jno FROM J WHERE jname ='' ); GO --删除建好的视图 DROP VIEW V_SPJ; GO --第二种方法

CREATE VIEW V_SPJ AS SELECT sno,pno,qty FROM SPJ,J WHERE J.jno=SPJ.jno AND J.jname=''; 3.用SQL语句完成第五版教材第三章第11题中的视图查询(10分,每小题5分)。 11.请为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码 (PNO)、供应数量(QTY)。 针对该视图VSP完成下列查询: (1)找出三建工程项目使用的各种零件代码及其数量。 (2)找出供应商S1的供应情况。

4.用SQL语句完成视图的数据更新。(15分,每题5分) (1)给视图V_SPJ中增加一条数据。 提示: -SPJ表中JNO允许为空时,数据可以插入基本表,此时JNO为NULL,由于JNO 为NULL,所以视图中没有该条数据。 -SPJ表中JNO不能为空时,可以使用instead of触发器实现。 (2)修改视图V_SPJ中的任意一条数据的供应数量。

数据库原理及应用(SQL Server 2008)第7章 索引与视图-ANSWER

7.6.1 选择题 7.6.2 填空题 1. 聚集索引非聚集索引唯一性索引索引视图 2. 修改数据 3. 创建表 4. 删除 5. 表扫描使用索引查找 7.6.3 简答题 1. 分析索引的优点和缺点。 答:这是因为创建索引可以大大提高系统的性能: (1)通过创建唯一性索引,可以保证每一行数据的唯一性。 (2)可以大大加快数据的检索速度,这也是索引的最主要的原因。 (3)可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 (4)在使用ORDER BY和GROUP BY子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 (5)通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。 既然增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?虽然索引有许多优点,但是为表中的每一个列都增加索引是非常不明智的做法。这是因为增加索引也有缺点: (1)创建索引和维护索引要耗费时间。 (2)索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚集索引,那么需要的空间就会更大。 (3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 2. 堆结构的特点是什么? 答:堆是不含聚集索引的表,表中的数据没有任何的顺序。堆结构中数据按照插入的先后次序存放,堆文件的数据页面不一定在物理上相邻。堆文件执行插入操作很容易,但是效率不高。因为堆文件只能执行顺序扫描,这对范围查询很有效,但对于随机查询(单个记录)的效率很低。查询最少的次数为1,最多的次数为N(N为记录数),平均次数为(N+1)/2。如果N比较大,耗费的CPU和I/O资源都会很大。 3. 什么是聚集索引和非聚集索引?比较这两种索引结构的特点。 答:聚集索引是一种数据表的物理顺序与索引顺序相同的索引。建立索引时,系统将对表的物理数据页中的数据按列进行排列,然后再重新存储到磁盘上,即聚集索引与数据是混为一体的。 非聚集索引是一种数据表的物理顺序与索引顺序不相同的索引。非聚集索引与聚集索引

SQL索引详解(优化数据库)

SQL索引一步到位 SQL索引在数据库优化中占有一个非常大的比例,一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱。 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头的在第二排,这样在找什么书就好说了,这个就是一个聚集索引,可是很多人借书找某某作者的,不知道书名怎么办?图书管理员在写一个目录,某某作者的书分别在第几排,第几排,这就是一个非聚集索引 字典的例子:字典前面的目录,可以按照拼音和部首去查询,我们想查询一个字,只需要根据拼音或者部首去查询,就可以快速的定位到这个汉字了,这个就是索引的好处,拼音查询法就是聚集索引,部首查询就是一个非聚集索引. 看了上面的例子,下面的一句话大家就很容易理解了:聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。就像字段,聚集索引是连续的,a后面肯定是b,非聚集索引就不连续了,就像图书馆的某个作者的书,有可能在第1个货架上和第10个货架上。还有一个小知识点就是:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。 1.2 索引的存储机制 首先,无索引的表,查询时,是按照顺序存续的方法扫描每个记录来查找符合条件的记录,这样效率十分低下,举个例子,如果我们将字典的汉字随即打乱,没有前面的按照拼 音或者部首查询,那么我们想找一个字,按照顺序的方式去一页页的找,这样效率有多底,大家可以想象。 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么都是从a-z的,是 具有连续性的,a后面就是b,b后面就是c,聚集索引就是这样的,他是和表的物理排列顺序是一样的,例如有id为聚集索引,那么1后面肯定是2,2后面肯定是3,所以说这样的搜索顺序的就是聚集索引。非聚集索引就和按照部首查询是一样是,可能按照偏房查询的时候,根据偏旁‘弓’字旁,索引出两个汉字,张和弘,但是这两个其实一个在100页,一个在1000页,(这里只是举个例子),他们的索引顺序和数据库表的排列顺序是不一样的,这个样的就是非聚集索引。 原理明白了,那他们是怎么存储的呢?在这里简单的说一下,聚集索引就是在数据库 被开辟一个物理空间存放他的排列的值,例如1-100,所以当插入数据时,他会重新排列 整个整个物理空间,而非聚集索引其实可以看作是一个含有聚集索引的表,他只仅包含原表中非聚集索引的列和指向实际物理表的指针。他只记录一个指针,其实就有点和堆栈差不多的感觉了

数据库原理与应用(清华大学版)课后答案第11章 索引

索 引 11.1 练习题11及参考答案 1.什么是索引?索引分为哪两种?各有什么特点? 答:索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。根据索引的顺序与数据表的物理顺序是否相同,可以把索引分成两种类型: ? 聚簇索引:数据表的物理顺序和索引表的顺序相同,它根据表中的一列或多列值 的组合排列记录。 ? 非聚簇索引:数据表的物理顺序和索引表的顺序不相同,索引表仅仅包含指向数 据表的指针,这些指针本身是有序的,用于在表中快速定位数据。 2.创建索引有什么优、缺点? 答:创建索引的优点如下: (1)加速数据检索。 (2)加快表与表之间的联接。 (3)在使用ORDER BY 和GROUP BY 等子句进行数据检索的时候,可以减少分组和排序的时间。 (4)有利于SQL Server 对查询进行优化。 (5)强制实施行的惟一性。 创建索引的缺点如下: (1)创建索引要花费时间和占用存储空间。 (2)建立索引加快了数据检索速度,却减慢了数据修改速度。 3.哪些列上适合创建索引?哪些列上不适合创建索引? 答:一般来说,以下的列适合创建索引: (1)主键:通常检索、存取表是通过主键来进行的,因此,应该考虑在主键上建立索引。 (2)连接中频繁使用的列:用于连接的列若按顺序存放,则系统可以很快地执行连接。如外键,除用于实现参照完整性外,还经常用于进行表的连接。 (3)在某一范围内频繁搜索的列和按排序顺序频繁检索的列。 以下的列不适合创建索引: 第 章 11

(1)很少或从来不在查询中引用的列,因为系统很少或从来不根据这个列的值去查找数据行。 (2)只有两个或很少几个值的列(如性别,只有两个值“男”或“女”),以这样的列创建索引并不能得到建立索引的好处。 (3)以bit、text、image数据类型定义的列。 (4)数据行数很少的小表一般也没有必要创建索引。 4.创建索引时须考虑哪些事项? 答:使用CREA TE INDEX语句创建索引。默认情况下,如果未指定聚集选项,将创建非聚集索引。创建索引时须考虑的事项如下: ?只有表的所有者可以在同一个表中创建索引。 ?每个表中只能创建一个聚集索引。 ?每个表可以创建的非聚集索引最多为249 个(包括PRIMARY KEY或UNIQUE 约束创建的任何索引)。 ?包含索引的所有长度固定列的最大大小为900字节。例如,不可以在定义为char(300)、char(300) 和char (301) 的三个列上创建单个索引,因为总宽度超过了 900 字节。 ?包含同一索引的列的最大数目为16。 5.如何创建升序和降序索引? 答:创建索引时,可以指定每列的数据是按升序还是降序存储。如果不指定,则默认为升序,另外,CREA TE TABLE、CREA TE INDEX和ALTER TABLE语句的语法在索引中的各列上支持关键字ASC(升序)和DESC(降序),例如: CREATE TABLE ObjTable --创建表ObjTable ( ObjID int PRIMARY KEY, ObjName char(10), ObjWeight decimal(9,3) ) CREATE NONCLUSTERED INDEX DescIdx ON --创建索引DescIdx ObjTable(ObjName ASC, ObjWeight DESC) 非聚集索引DescIdx以ObjName列升序、ObjWeight列降序进行索引。 6.FILLFACTOR所代表的物理含义是什么?将一个只读表的FILLFACTOR设为合适的值有什么好处? 答:FILLFACTOR的物理含义是指在定SQL Server创建索引的过程中,各索引页的填满程度。将一个非只读表的FILLFACTOR设为合适的值时,当系统向表中插入或更新数据时,SQL Server不需要花时间拆分该索引页,对于更新频繁的表,系统可以获得更好的更新性能。一个只读表的FILLFACTOR应设为100%。 11.2 上机实验题6及操作过程 在上机实验题5的factory数据库上,使用T-SQL语句完成如下各题:

Mysql索引原理

Mysql索引原理 导读:在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。 关键词:MySQL数据库索引MyISAM InnoDB存储引擎 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。 MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则图8是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:

同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。 InnoDB索引实现 虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。 第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree 组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

数据库原理实验报告实验四视图与索引

数据库原理实验报告实验 四视图与索引 The Standardization Office was revised on the afternoon of December 13, 2020

一、实验内容、步骤以及结果 1.在Student数据库中,利用图形用户界面,创建一个选修了“数据库原理”课程并且是1996年出生的学生的视图,视图中包括学号,性别,成绩三个信息。(5分) 2.用两种不同的SQL语句创建第五版教材第三章第9题中要求的视图(视图名:V_SPJ)(10分,每种方法5分)。 --第一种方法 CREATE VIEW V_SPJ AS SELECT sno,pno,qty FROM SPJ WHERE jno=( SELECT jno FROM J WHERE jname ='三建' ); GO --删除建好的视图 DROP VIEW V_SPJ; GO --第二种方法 CREATE VIEW V_SPJ AS

SELECT sno,pno,qty FROM SPJ,J WHERE=AND='三建'; 3.用SQL语句完成第五版教材第三章第11题中的视图查询(10分,每小题5分)。 11.请为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、 零件代码(PNO)、供应数量(QTY)。 针对该视图VSP完成下列查询: (1)找出三建工程项目使用的各种零件代码及其数量。 (2)找出供应商S1的供应情况。

4.用SQL语句完成视图的数据更新。(15分,每题5分) (1)给视图V_SPJ中增加一条数据。 提示: -SPJ表中JNO允许为空时,数据可以插入基本表,此时JNO为NULL,由于JNO为NULL,所以视图中没有该条数据。 -SPJ表中JNO不能为空时,可以使用instead of触发器实现。 (2)修改视图V_SPJ中的任意一条数据的供应数量。

《数据库原理》期末试卷及答案(A)

《数据库系统原理》期末试题及答案 一、单项选择(本大题共20小题,每题1分,共20分。在每小题列出的4个选项中只有一个是符合题目要求的,请将其代码填在题后的括号内。错选或未选都无分。) 1、数据库管理系统是数据库系统的核心,它负责有效地组织、存储、获取或管理数据,属于一种【】,是位于用户和操作系统之间的一层数据管理软件。 A、系统软件 B、工具软件 C、应用软件 D、教学软件 2、数据模型的三要素是指【】。 A、数据结构、数据对象和共享 B、数据结构、数据操作和数据控制 C、数据结构、数据操作和完整性 D、数据结构、数据操作和完整性约束条件 3、用有向图结构表示实体类型及实体间联系的数据模型是【】。 A、关系模型 B、层次模型 C、网状模型 D、面向对象模型 4、关系模型概念中,不含有多余属性的超键称为【】。 A、候选键 B、对键 C、内键 D、主键 5、SQL语言是【】。 A、高级语言 B、非过程化语言 C、汇编语言 D、宿主语言 6、在SQL中,与关系代数中的投影运算相对应的子句是【】。 A、SELECT B、FROM C、WHERE D、ORDER BY 7、在SQL查询时,如果要去掉查询结果中的重复组,需使用【】。 A、UNIQUE B、COUNT C、DISTINCT D、UNION 8、关于视图,下列说法中正确的是【】。 A、对视图的使用,不可以进行查询和修改操作 B、视图只能从表中导出 C、视图与表一样也存储着数据 D、对视图的操作,最终要转化为对基本表的操作 9、SELECT语句中使用* 表示【】。 A选择任何属性 B 选择全部属性 C 选择全部元组 D 选择键码 10、下列概念中,【】不用于嵌入式SQL和宿主语言之间的交互。 A、通信区 B、游标

数据库索引原理

数据库索引原理 SQL SERVER(下称 SQLS)为例,将数据库管理中难于理解的“索引原理”问题给各位朋友作一个深入浅出的介绍。其他的数据库管理系统如Oracle、Sybase等,朋友们可以融会贯通,举一反三。 一、数据表的基本结构 建立数据库的目的是管理大量数据,而建立索引的目的就是提高数据检索效率,改善数据库工作性能,提高数据访问速度。对于索引,我们要知其然,更要知其所以然,关键在于认识索引的工作原理,才能更好的管理索引。为认识索引工作原理,首先有必要对数据表的基本结构作一次全面的复习。 SQLS当一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个8K用完的时候,SQLS指针会自动分配一个8K的空间。这里,每个8K空间被称为一个数据页(Page),又名页面或数据页面,并分配从0-7的页号,每个文件的第0页记录引导信息,叫文件头(File header);每8个数据页(64K)的组合形成扩展区(Extent),称为扩展。全部数据页的组合形成堆(Heap)。 SQLS规定行不能跨越数据页,所以,每行记录的最大数据量只能为8K。这就是char和varchar这两种字符串类型容量要限制在8K以内的原因,存储超过8K的数据应使用text类型,实际上,text类型的字段值不能直接录入和保存,它只是存储一个指针,指向由若干8K的文本数据页所组成的扩展区,真正的数据正是放在这些数据页中。页面有空间页面和数据页面之分。 当一个扩展区的8个数据页中既包含了空间页面又包括了数据或索引页面时,称为混合扩展(Mixed Extent),每张表都以混合扩展开始;反之,称为一致扩展(Uniform Extent),专门保存数据及索引信息。 表被创建之时,SQLS在混合扩展中为其分配至少一个数据页面,随着数据量的增长,SQLS可即时在混合扩展中分配出7个页面,当数据超过8个页面时,则从一致扩展中分配数据页面。 空间页面专门负责数据空间的分配和管理,包括:PFS页面(Page free space):记录一个页面是否已分配、位于混合扩展还是一致扩展以及页面上还有多少可用空间等信息;GAM页面(Global allocation map)和SGAM页面(Secodary global allocation map):用来记录空闲的扩展或含有空闲页面的混合扩展的位置。SQLS综合利用这三种类型的页面文件在必要时为数据表创建新空间; 数据页或索引页则专门保存数据及索引信息,SQLS使用4种类型的数据页面来管理表或索引:它们是IAM页、数据页、文本/图像页和索引页。 在WINDOWS中,我们对文件执行的每一步操作,在磁盘上的物理位置只有系统(system)才知道;SQL SERVER沿袭了这种工作方式,在插入数据的过程中,不但每个字段值在数据页面中的保存位置是随机的,而且每个数据页面在“堆”中的排列位置也只有系统(system)才知道。 这是为什么呢?众所周知,OS之所以能管理DISK,是因为在系统启动时首先加载了文件分配表:FAT(File Allocation Table),正是由它管理文件系统并记录对文件的一切操作,系统才得以正常运行;同理,作为管理系统级的SQL SERVER,也有这样一张类似FAT的表存在,它就是索引分布映像页:IAM(Index Allocation Map)。 IAM的存在,使SQLS对数据表的物理管理有了可能。

数据库索引原理

一、引言 对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助。有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步。[最近首页之争沸沸扬扬,也不知道这个放在这合适么,苦劳?功劳?……] 二、B-Tree 我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree。例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是B-Tree。所以在最开始,简单地介绍一下B-Tree。 B-Tree不同于Binary Tree(二叉树,最多有两个子树),一棵M阶的B-Tree满足以下条件:1)每个结点至多有M个孩子; 2)除根结点和叶结点外,其它每个结点至少有M/2个孩子; 3)根结点至少有两个孩子(除非该树仅包含一个结点); 4)所有叶结点在同一层,叶结点不包含任何关键字信息; 5)有K个关键字的非叶结点恰好包含K+1个孩子; 另外,对于一个结点,其内部的关键字是从小到大排序的。以下是B-Tree(M=4)的样例: 对于每个结点,主要包含一个关键字数组Key[],一个指针数组(指向儿子)Son[]。在B-Tree 内,查找的流程是:使用顺序查找(数组长度较短时)或折半查找方法查找Key[]数组,若找到关键字K,则返回该结点的地址及K在Key[]中的位置;否则,可确定K在某个Key[i]和Key[i+1]之间,则从Son[i]所指的子结点继续查找,直到在某结点中查找成功;或直至找到叶结点且叶结点中的查找仍不成功时,查找过程失败。 接着,我们使用以下图片演示如何生成B-Tree(M=4,依次插入1~6): 从图可见,当我们插入关键字4时,由于原结点已经满了,故进行分裂,基本按一半的原则进行分裂,然后取出中间的关键字2,升级(这里是成为根结点)。其它的依类推,就是这样一个大概的过程。

数据库原理期末标准试题第6套及标准答案(格式绝对符合标准)

数据库原理试题F 考试时间:120分钟 一、单选题(每小题后的四个备选答案中只有一个是正Array确的,请将你认为正确的那个编号填入题目的括号内。 每小题 1分,本大题共20分。) 1、下面对数据库特点的不正确叙述是()。 A.数据库中的数据采用统一的数据模型表示。 B.数据之间的联系不强。 C.数据冗余度低。 D.数据由一个软件(DBMS)统一管理。 2、下面对数据模型的不正确叙述是()。 A.数据模型是用来表示数据及数据之间联系的。 B.数据模型可分为三个层次:概念模型、逻辑模型、物理模型。 C.逻辑层次上的数据模型有三个要素:数据结构、数据操作、数据完整 性约束。 D.到目前为止,逻辑数据模型只有三种:层次模型、网状模型、关系模 型。 3、下面对数据库三级模式结构的叙述中,不正确的是()。 A.三级模式结构可提供数据独立性。 B.三级模式结构通过两级映象来实现数据独立性。 C.模式做了修改,用户的应用程序不必修改。 D.内模式做了修改,模式一要定修改。 4、下面对“关系”的叙述中,不正确的说法是()。 A.关系中元组顺序的改变不影响关系结果。 B.关系中的属性可以再分割。 C.关系中不允许在关系中出现两条完全相同的元组。 D.关系中属性顺序的改变不会影响关系结果。

5、下面关于“外键”概念的叙述中,不正确的叙述是()。 A.外键用来建立关系之间的联系。 B.在一个关系中,一个属性不能既主键又是外键。 C.一个关系的主属性可以是外键。 D.一个关系可以有多个外键。 6、设关系R和S的属性集相同,W是R的属性集的子集,下面不正确的等式是()。 A.πW(R∪S)=πW(R)∪πW(S) B.σ(F)(R-S)=σ(F)(R)-σ(F)(S) C.σ(F)(R∪S)=σ(F)(R)∪σ(F)(S) D.σ(F)(R∩S)=σ(F)(R)∩σ(F)(S) 7、不属于DBA职责的是()。 A.查看或修改数据库中的数据。B.对数据库访问的授权 C.完整性约束的说明D.模式定义 8、在关系模式R(U)中,X?U,Y?U,X→Y,且Y不包含于X,Y也不能决定X则X与Y之间的关系是()。 A.一对一B.多对多C.一对多D.多对一 9、设有关系模式R(ABC),下面关于不正确的函数依赖推理是()。 A.A→B,B→C,则A→C。 B.AB→C,则A→C,B→C。 C.A→B,A→C,则A→BC。 D.A→B,C→B,则AC→B。 10、下面对3NF的叙述中,正确的说法是()。 A.3NF中的任何一个函数依赖X→Y,都有X是超键。 B.3NF中的任何一个函数依赖X→Y,都有Y∈X。 C.如果模式R是3NF,那么R一定是2NF。 D.3NF中的任何一个函数依赖X→Y,都有Y是主属性。

2021年数据库原理实验报告-实验四-视图与索引之欧阳学文创编

一、实验内容、步骤以及结果 1.在Student数据库中,利用图形用户界面,创建一个选修了“数据库原理”课程并且是1996年出生的学生的视图,视图中包括学号,性别,成绩三个信息。(5分) 2.用两种不同的SQL语句创建第五版教材第三章第9题中要求的视图(视图名:V_SPJ)(10分,每种方法5分)。 --第一种方法 CREATEVIEW V_SPJ AS SELECT sno,pno,qty FROM SPJ WHERE jno=( SELECT jno FROM J WHERE jname ='三建' ); GO --删除建好的视图 DROPVIEW V_SPJ; GO --第二种方法

CREATEVIEW V_SPJ AS SELECT sno,pno,qty FROM SPJ,J WHERE J.jno=SPJ.jno AND J.jname='三建'; 3.用SQL语句完成第五版教材第三章第11题中的视图查询(10分,每小题5分)。 11.请为三建工程项目建立一个供应情况的视图,包括供应商代 码(SNO)、零件代码(PNO)、供应数量(QTY)。 针对该视图VSP完成下列查询: (1)找出三建工程项目使用的各种零件代码及其数量。 (2)找出供应商S1的供应情况。 4.用SQL语句完成视图的数据更新。(15分,每题5分) (1)给视图V_SPJ中增加一条数据。 提示: -SPJ表中JNO允许为空时,数据可以插入基本表,此时JNO 为NULL,由于JNO为NULL,所以视图中没有该条数据。 -SPJ表中JNO不能为空时,可以使用instead of触发器实现。 (2)修改视图V_SPJ中的任意一条数据的供应数量。 (3)删除视图V_SPJ中的任意一条数据(注意所创建视图可以视 图消解时,才能正常删除,否则会删除失败;也可以考虑用 instead of触发器实现)。

数据库原理与应用课后作业参考答案

模块1 数据库理论基础 1. 某医院病房计算机管理中心需要如下信息: 科室:科名、科地址、科电话、医生姓名 病房:病房号、床位号、所属科室名 医生:姓名、职称、所属科室名、年龄、工作证号 病人:病历号、姓名、性别、诊断、主管医生、病房号 其中,一个科室有多个病房、多个医生,一个病房只能属于一个科室,一个医生只属于一个科室,但可负责多个病人的诊治,一个病人的主管医生只有一个。 请设计该计算机管理系统的E-R模型。 答: 2. 一个图书馆借阅管理数据库要求提供下述服务: (1)可随时查询书库中现有书籍的品种、数量与存放位置。所有各类书籍均可由书号唯一标识。 (2)可随时查询书籍借还情况,包括借书人单位、姓名、借书证号、借书日期和还书日期。我们约定:任何人可借多种书,任何一种书可为多个人所借,借书证号具有唯一性。

(3)当需要时,可通过数据库中保存的出版社的电报编号、电话、邮编及地址等信息向相应出版社增购有关书籍。我们约定,一个出版社可出版多种书籍,同一教材仅为一个出版社出版,出版社名具有唯一性。 请根据以上情况和假设设计满足需求的E-R模型。 答: 模块3 表的操作 一.填空题 1.数字数据可分为整数型、精确数值型和近似数值型3种类型。其中,精确数值型数据由由整数和小数两部分组成 2.在创建表的命令语句中,要设置表字段属性为自动编号的关键字是IDENTITY。 3.SQL Server 2008中,根据表的用途可以分为4类,即系统表、用户表、已分区表和临时表。 4.如果表中记录的某一字段或字段组合能唯一标识记录,则称该字段或字段组合 为_主键_。 5.创建数据库表的命令语句是create table。 二.选择题 1.使用SQL语句修改表结构时,其语句是下面的( B )选项。 A. ALTER DATABASE TABLE C. UPDATE TABLE DABASE 2.下列对表的描述正确的是( C )。 A.在数据库中表用来表示关系模型中的实体 B.表是对数据进行存储和操作的一种逻辑结构 C.表是用来组织和存储数据的数据库对象 D.表可以存储数据库的其他数据库对象 3.在SQL Server 2008的数据类型中可以用来存储图片的数据类型是( B ) A. binary 4.使用系统存储过程( C )可以查看表的行、大小和空间的统计信息。 A. sp_table

《数据库原理》知识点总结

数据库系统概述 一、有关概念 1.数据 2.数据库(DB) 3.数据库管理系统(DBMS ) Access 桌面DBMS VFP SQL Server Oracle 客户机/服务器型DBMS MySQL DB2 4.数据库系统(DBS) 数据库(DB) 数据库管理系统(DBMS ) 开发工具 应用系统 二、数据管理技术的发展 1.数据管理的三个阶段 (1)人工管理阶段 (2)文件系统阶段 (3)数据库系统阶段 概念模型 一、模型的三个世界 1.现实世界 2.信息世界:即根据需求分析画概念模型(即E-R 图),E-R 图与DBMS 无关。 3.机器世界:将E-R 图转换为某一种数据模型,数据模型与DBMS 相关。 注意:信息世界又称概念模型,机器世界又称数据模型 二、实体及属性 1.实体:客观存在并可相互区别的事物。 2.属性: 3.关键词:能唯一标识每个实体又不含多余属性的属性组合。 一个表的码可以有多个,但主码只能有一个。 4.实体型:即二维表的结构 5.实体集:即整个二维表 三、实体间的联系:

1.两实体集间实体之间的联系 1:1 联系、1:n 联系、m:n 联系 2.同一实体集内实体之间的联系 1:1 联系、1:n 联系、m:n 联系 数据模型 一、层次模型:用树型结构表示实体之间的联系。 二、网状模型:用图结构表示实体之间的联系。 三、关系模型:用二维表表示实体之间的联系。 1.重要术语: 关系:一个关系就是一个二维表; 元组:二维表的一行,即实体; 关系模式:在实体型的基础上,注明主码。 关系模型:指一个数据库中全部二维表结构的集合。 数据库系统结构 数据库系统的模式结构 三级模式 1.模式:是数据库中全体数据的逻辑结构和特征的描述。 ①模式只涉及数据库的结构;模式既不涉及应用程序,又不涉及数据库结构的存储; ②外模式:是模式的一个子集,是与某一个应用程序有关的逻辑表示。 特点:一个应用程序只能使用一个外模式,但同一个外模式可为多个应用程序使用。 ③内模式:描述数据库结构的存储,但不涉及物理记录。 2.两级映象 ①外模式/模式映象:保证数据库的逻辑独立性; ②模式/内模式映象:保证数据库的物理独立性; 3.两级映象的意义 ①使数据库与应用系统完全分开,数据库改变时,应用系统不必改变。 ②数据的存取完全由DBMS 管理,用户不必考虑存取路径。 数据库管理系统 1.DBMS 的功能:负责对数据库进行统一的管理与控制。 ①数据定义:即定义数据库中各对象的结构 ②数据操纵:包括对数据库进行查询、插入、删除、修改等操作。 ③数据控制:包括安全性控制、完整性控制、并发控制、数据库恢复。 2.DBMS 的组成: DDL 语言 DML语言

数据库原理期末标准试题第5套及标准答案(格式绝对符合标准)

数据库原理试题E 考试时间:120分钟 一、单选题(每小题后的四个备选答案中只有一个是正确的,请将你认为正确的那个编号填入题目的括号内。每小题 1分,本大题共15分。) 1、下面对数据模型的不正确叙述是( )。 A .数据模型是用来表示数据及数据之间联系的。 B .数据模型可分为三个层次:概念模型、逻辑模型、物理模型。 C .逻辑层次上的数据模型有三个要素:数据结构、数据操作、数据完整 性约束。 D .到目前为止,逻辑数据模型只有:层次模型、网状模型、关系模型。 2、下面对数据库三级模式结构的叙述中,不正确的是( )。 A .三级模式结构可提供数据独立性。 B .三级模式结构通过两级映象来实现数据独立性。 C .模式做了修改,用户的应用程序必须修改。 D .内模式做了修改,模式不一定修改。 3、下面对“关系模型”的叙述中,不正确的说法是( )。 A .关系模型的数据结构就是关系。 B .关系是一个属性数目相同的元组集合。 C .关系模型允许在关系中出现两条完全相同的元组。 D .关系模型具有三类完整性约束。 4、下面对关系“键”概念的不正确叙述是( )。 A .一个关系只能有一个候选键。 B .候选键是指在一个关系中,能够唯一标识每个元组且不含多余属性的属 性集。 C .一个关系模式只能有一个“主键”。

D.候选键再添加一个属性便可构成一个“超键”。 5、设关系R和S的属性集相同,W是R的属性集的子集,下面不正确的等式是()。 A.πW(R-S)=πW(R)-πW(S) B.σ(F)(R-S)=σ(F)(R)-σ(F)(S) C.σ(F)(R∪S)=σ(F)(R)∪σ(F)(S) D.πW(R∪S)=πW(R)∪πW(S) 6、在关系模式R(U)中,X?U,Y?U,X→Y,且Y不能决定X,则X 与Y之间的关系是()。 A.一对一B.一对多C.多对多D.多对一 7、下面对3NF的叙述中,不正确的说法是()。 A.3NF模式中不存非主属性对侯选键的传递依赖。 B.3NF中的任何一个函数依赖X→Y,都有Y∈X。 C.如果模式R是3NF,那么R一定是2NF。 D.3NF中的任何一个非平凡函数依赖FD X→Y,若X不是超键则X必然是主属性。 8、在()组织结构中,记录一般是以输入顺序为序存储的。A.顺序文件B.堆文件C.散列文件D.聚集文件 9、下面关于“索引”概念的不正确叙述是()。 A.索引能够提高查询效率。 B.索引的组织方式主要有线性索引和树形索引两种。。 C.主索引的索引顺序与主文件的记录存储顺序保持一致。 D.由于索引能提高查询速度,所以对一个表来说:“索引建的越多越好”。 10、下面不属于系统目录内容的是()。 A.模式、内模式、外模式之间的映像。 B.安全性规则、完整性规则。 C.事务日志。 D.索引的定义信息。

相关文档
相关文档 最新文档