数据库原理及应用(SQL Server 2008)第7章 索引与视图-ANSWER
- 格式:doc
- 大小:44.00 KB
- 文档页数:3
SqlServer索引的原理与应⽤索引的概念索引的⽤途:我们对数据查询及处理速度已成为衡量应⽤系统成败的标准,⽽采⽤索引来加快数据处理速度通常是最普遍采⽤的优化⽅法。
索引是什么:数据库中的索引类似于⼀本书的⽬录,在⼀本书中使⽤⽬录可以快速找到你想要的信息,⽽不需要读完全书。
在数据库中,数据库程序使⽤索引可以重啊到表中的数据,⽽不必扫描整个表。
书中的⽬录是⼀个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表。
索引的利弊:查询执⾏的⼤部分开销是I/O,使⽤索引提⾼性能的⼀个主要⽬标是避免全表扫描,因为全表扫描需要从磁盘上读取表的每⼀个数据页,如果有索引指向数据值,则查询只需要读少数次的磁盘就⾏啦。
所以合理的使⽤索引能加速数据的查询。
但是索引并不总是提⾼系统的性能,带索引的表需要在数据库中占⽤更多的存储空间,同样⽤来增删数据的命令运⾏时间以及维护索引所需的处理时间会更长。
所以我们要合理使⽤索引,及时更新去除次优索引。
数据表的基本结构⼀个新表被创建之时,系统将在磁盘中分配⼀段以8K为单位的连续空间,当字段的值从内存写⼊磁盘时,就在这⼀既定空间随机保存,当⼀个 8K⽤完的时候,数据库指针会⾃动分配⼀个8K的空间。
这⾥,每个8K空间被称为⼀个数据页(Page),⼜名页⾯或数据页⾯,并分配从0-7的页号, 每个⽂件的第0页记录引导信息,叫⽂件头(File header);每8个数据页(64K)的组合形成扩展区(Extent),称为扩展。
全部数据页的组合形成堆(Heap)。
SQLS规定⾏不能跨越数据页,所以,每⾏记录的最⼤数据量只能为8K。
这就是char和varchar这两种字符串类型容量要限制在8K以内的原因,存储超过8K的数据应使⽤text类型,实际上,text类型的字段值不能直接录⼊和保存,它只是存储⼀个指针,指向由若⼲8K的⽂本数据页所组成的扩展区,真正的数据正是放在这些数据页中。
实用标准文档SQL Server 2008数据库应用与开发教程(第二版)第一章习题参考答案1.简述SQL Server 2008系统中主要数据库对象的特点。
答:主要的数据库对象包括数据库关系图、表、视图、同义词、存储过程、函数、触发器、程序集、类型、规则和默认值等。
“表”节点中包含了数据库最基本、最重要的对象——表。
表实际用来存储系统数据和用户数据,是最核心的数据库对象。
“视图”节点包含了数据库中的视图对象。
视图是一种虚拟表,用来查看数据库中的一个或多个表,视图是建立在表基础之上的数据库对象,它主要以SELECT语句形式存在。
在“同义词”节点中包含了数据库中的同义词对象。
这是Microsoft SQL Server 2008系统新增的一种对象。
“可编程性”对象是一个逻辑组合,它包括存储过程、函数、触发器、程序集、类型、规则和默认值等对象。
数据库中的函数对象包含在“函数”节点中。
函数是接受参数、执行复杂操作并将结果以值的形式返回的例程。
2.SQL Server 2008数据库管理系统产品分为哪几个版本,各有什么特点?答:SQL Server 2008数据库管理系统产品的服务器版本包括了企业版和标准版,专业版本主要包括以下版本:工作组版(Workgroup)、开发人员版(Developer)、免费精简版(Express)、Web版,以及免费的集成数据库SQL Server Compact 3.5。
3.SQL Server 2008包含哪些组件,其功能各是什么?答:SQL Server 2008的体系结构是对SQL Server的组成部分和这些组成部分之间的描述。
Microsoft SQL Server 2008系统由4个组件组成,这4个组件被称为4个服务,分别是数据库引擎、Analysis Services、Reporting Services和Integration Services。
数据库引擎是Microsoft SQL Server 2008系统的核心服务,负责完成数据的存储、处理、查询和安全管理等操作。
《数据库原理及应用》习题参考答案第1章 (1)第2章 (3)第3章 (3)第4章 (4)第5章 (4)第6章 (4)第7章 (5)第8章 (6)第9章 (7)第10章 (9)第11章 (10)第12章 (11)第13章 (12)第1章1.12(单选题)设有如下关系R和S,关系代数表达式R÷S的运算结果是____。
选项如下:关系代数表达式R÷S的运算结果是__(B)__。
分析:在本题中,R的属性有A、B、C、D,而S的属性有C、D、E,因此,R÷S的属性有A、B。
求除法的简单方法是在关系R中寻找属性C和D的值同时满足关系S中属性C和D的所有元组的元组。
在关系R中,第1个元组(2,1,a,c)和第5个元组(2,1,b,d),其A和B的属性值相同,而C和D的属性值满足关系S中的C和D的所有属性值,因此(2,1)将是R÷S的元组。
关系R元组(3,2)对应C、D属性的值为(b,d)和(b、c),它不能满足关系S中属性C、D中的(a、c),因此满足要求。
所以,正确答案是B。
解答:1.14 假设某商业集团数据库中有1个关系模式R(商店编号,商品编号,数量,部门编号,负责人)。
如果规定:(a)每个商店的每种商品只在一个部门销售。
(b)每个商店的每个部门只有一个负责人。
(c)每个商店的每种商品只有一个库存数量。
(1)写出关系模式R的基本函数依赖集(2)找出关系模式R的候选码。
(3)关系模式R最高已经达到第几范式?为什么?(4)如果R不属于3NF,请将R分解成3NF。
分析与解答:(1)基本的函数依赖有:(商店编号+商品编号) →部门编号(商店编号+部门编号) →负责人(商店编号+商品编号) →数量(2)由题意,上面的函数依赖可知“商店编号”是主属性,商品编号也是主属性,由这两个属性,可以确定关系元组的所有属性,所以R的候选码是:商店编号+商品编号。
(3)R(商店编号,商品编号,数量,部门编号,负责人) 最高已达到2NF。
第 7 章视图与索引(1)数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合用户的需求。
SQL Server 2008可以根据用户的各种需求重新构造表的数据结构,这种数据结构就是视图。
视图是关系型数据库系统提供给用户以多种角度观察数据库中数据的重要机制。
索引是以表列为基础的数据库对象,它保存着表中排序的索引列,并且记录了索引列在数据表中的物理存储位置,实现了表中数据的逻辑排序。
7.1 视图视图是从一个或几个表导出来的表,它不是真实存在的基本表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图实际上是一个查询结果,视图的名字和视图对表的查询存储在数据字典中。
7.1.1视图的基本概念视图包含了一系列带有名称的列和数据行,这些列和数据行来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基本表来说,视图的作用类似于筛选。
定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。
从数据库系统外部来看,视图就如同一个表一样,对表能够进行的一般操作都可以应用于视图,例如查询、插入、修改和删除操作等。
但对数据的操作要满足一定的条件,当对通过视图看到的数据进行修改时,相应的基本表的数据也会发生变化,同样,若基本表的数据发生变化,这种变化也会自动地反映到视图中。
1.视图的主要作用视图的主要作用体现在如下三个方面:(1)简单性。
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。
那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
(2)安全性。
通过视图用户只能查询和修改他们所能见到的数据。
数据库中的其它数据则既看不见也取不到。
数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。
通过视图,用户可以被限制在数据的不同子集上,例如,被限制在某视图的一个子集上,或是一些视图和基本表合并后的子集上。
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. 什么是聚集索引和非聚集索引?比较这两种索引结构的特点。
答:聚集索引是一种数据表的物理顺序与索引顺序相同的索引。
建立索引时,系统将对表的物理数据页中的数据按列进行排列,然后再重新存储到磁盘上,即聚集索引与数据是混为一体的。
非聚集索引是一种数据表的物理顺序与索引顺序不相同的索引。
非聚集索引与聚集索引
具有相同的B树结构,但是在非聚集索引中,基础表的数据行不是按照非聚集键的顺序排序和存储,且非聚集索引的叶级是由索引页而不是由数据页组成。
非聚集索引既可以定义在表或视图的聚集索引上,也可以定义在表或视图的堆上。
非聚集索引中的每一个索引行都是由非聚集键值和行定位符组成,该行定位符指向聚集索引或堆中包含该键值的数据行。
当在一个聚集索引上构建非聚集索引时,索引中的指针值就是数据行的聚集索引键值。
4. 为什么要使用视图?
答:视图是查看数据库表中数据的一种方式。
视图提供了存储预定义的查询语句作为数据库中的对象以备以后使用的能力。
视图是一种逻辑对象,是一种虚拟表。
视图结合了基本表和查询两者的特性:用户可以使用视图从一个或多个相关的基表中提取一个数据集(查询特性);用户能运用视图去更新视图中的信息,并且持久地存储到磁盘(表特性)。
5. 视图的数据来自何处?能否说视图不占据任何的物理空间,为什么?
答:视图是一种逻辑对象,是一种虚拟表。
除非是索引视图,否则视图不占物理存储空间。
在视图中被查询的表称为视图的基表。
大多数的SELECT语句都可以用在视图的创建中。
不能说视图不占据任何的物理空间。
因为,一般情况下的视图都是标准视图,它是一个虚拟表并不占物理存储空间。
如果希望提高聚合多行数据的视图性能,那么可以创建索引视图。
索引视图是被物理化的视图,它包含有经过计算的物理数据。
6. 如何使用CREATE VIEW语句创建视图?
答:使用Transact-SQL语句中的CREATE VIEW命令创建视图的语法形式如下:CREATE VIEW view_name [ ( column [ ,...n ] ) ] [ WITH < view_attribute > [ ,...n ] ]
AS
select_statement [ WITH CHECK OPTION ]
< view_attribute > ::=
{ ENCRYPTION | SCHEMABINDING | VIEW_METADATA }
7. 如何创建索引视图?
答:创建索引视图时,视图不能引用任何其他视图,只能引用基表。
另外,必须使用SCHEMABINDING 子句将视图绑定到架构。
8. 如何查看视图的定义文本?
答:使用系统存储过程语句sp_helptext查看视图、触发器、存储过程在系统表中的定义文本,其语法形式如下:
sp_helptext [@objname = ] ‘name’
参数[@objname = ] ‘name’为对象的名称,对象必须在当前数据库中。
7.7上机实验
(1)建立索引
1)
USE stu
Go
CREATE INDEX index_Sno ON _Student(Sno)___
2)
USE stu
Go
CREATE _ NOCLUSTERED INDEX index_Cno ON Courses(Cno)
3)
USE stu
GO
CREATE INDEX index_Sname_Sno ON_Student(姓名,学号)__
4)
USE stu
GO
CREATE CLUSTERED INDEX index_SCno ON_Enrollment(学号,课程号)_
5)
USE stu
GO
CREATE UNIQUE CLUSTERED INDEX index_Cno_Cname _ON Courses(课程号,课程名) WITH PAD_INDEX,FILLFACTOR=80,IGNORE_DUP_KEY
(2)创建视图
CREATE VIEW view_name [ ( column [ ,...n ] ) ] [ WITH < view_attribute > [ ,...n ] ]
AS
select_statement [ WITH CHECK OPTION ]
< view_attribute > ::=
{ ENCRYPTION | SCHEMABINDING | VIEW_METADATA }
1)
CREATE VIEW V_female AS SELECT * FROM Student WHERE Ssex=’F’
2)
CREATE VIEW V_age AS SELECT Sno,Sage FROM Student
3)
CREATE VIEW V_ average Sno, average AS SELECT Sno, A VG(Grade) FROM Student
(3)使用视图
SELECT Sno,name,___average__ FROM Student ,V_average WHERE_ Student .Sno= V_average .Sno。