数据库原理及应用(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系统的核心服务,负责完成数据的存储、处理、查询和安全管理等操作。
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。