版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 视图与索引 本章要点 数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合用户的需求,SQL Server可以按照用户应用需求定义出新的表,这样的面向用户的新表称为视图,视图是一种虚表,对其的更新操作有限制。在数据库中为了迅速地从庞大的数据库中找到所需要的数据,SQL Server 2005提供了类似书的目录作用的索引技术,合理使用索引技术能得到良好的查询性能。 本章主要介绍SQL Server 2005数据库系统视图的创建以及使用,索引类型及索引的创建、使用等,内容包括:视图概述、创建视图与使用视图、视图定义信息的查阅、视图的修改、了解与创建索引、修改索引与查看索引信息、删除
2、索引、全文索引与全文搜索等。 首都医科大学计算机基础本章目录8.1 视图8.2 索引8.3 全文索引与全文搜索练习题8 上机实习7 8.1 视图 8.1.1 视图概述8.1.2 创建视图8.1.3 使用视图8.1.4 视图定义信息的查阅8.1.5 视图的修改与删除 返回本节首页8.1.1 视图概述返回本节首页 视图是一个虚拟表,其内容由查询定义,数据库中存储的是查询定义对应的SELECT 语句。同真实的表一样,视图包含一系列带有名称的列和行数据。视图(除索引视图)在数据库中并不是以数据值存储集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。用户可以采用引用表时所使
3、用的方法,在 T-SQL 语句中引用视图名称来使用此虚拟表。 对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。例如,如果有多台不同的服务器分别存储您的单位在不同地区的数据,而您需要将这些服务器上结构相似的数据组合起来,这种方式就很有用。 通过视图进行查询没有任何限制,通过它们进行数据更新操作时是有些限制的。下图显示了在两个表上建立视图的情况。8.1.1 视图概述返回本节首页图8-1 建立视图的示意图8.1.1 视图概述返回本节首页 1、视图类型 在SQL Server 2005中
4、,有三种视图,它们是标准视图、索引视图和分区视图。 1)标准视图:它组合了一个或多个表中的数据,您可以获得使用视图的大多数好处,包括将重点放在特定数据上及简化数据操作。 2)索引视图:它是被具体化了的视图,即它已经过计算并存储。可以为视图创建索引,即对视图创建一个唯一的聚集索引。索引视图可以显著提高某些类型查询的性能。索引视图尤其适于聚合许多行的查询。但它们不太适于经常更新的基本数据集。 3)分区视图:它是在一台或多台服务器间水平连接一组成员表中的分区数据。这样,数据看上去如同来自于一个表。联接同一个 SQL Server 实例中的成员表的视图是一个本地分区视图。如果视图在服务器间联接表中的数
5、据,则它是分布式分区视图。分布式分区视图用于实现数据库服务器联合。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。通过这种通过分区数据形成数据库服务器联合体的机制可以向外扩展一组服务器,以支持大型的多层网站的处理需要。8.1.1 视图概述返回本节首页 2、视图的作用 视图通常用来集中、简化和自定义每个用户对数据库的不同认识。视图可用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问视图基础表的权限。视图可用于提供向后兼容接口来模拟曾经存在但其架构已更改的表。还可以在向SQL Server 2005复制数据和从其中复制数据时使用视图,以便提高性能并对数据进行分区。
6、8.1.1 视图概述返回本节首页1)着重于特定数据视图使用户能够着重于他们所感兴趣的特定数据和所负责的特定任务。不必要的数据或敏感数据可以不出现在视图中。例如,AdventureWorks示例数据库中的视图vBikes允许用户查看当前库存的所有自行车的名称。该视图将从Product表中筛选掉除Name之外的所有字段,并仅返回自行车成品的名称,而不是自行车配件的名称。CREATE VIEW vBikes AS SELECT DISTINCT p.Name FROM Production.Product p JOIN Production.ProductInventory i ON p.Produ
7、ctID=i.ProductID JOIN Production.ProductSubCategory ps ON p.ProductSubcategoryID=ps.ProductSubCategoryID JOIN Production.ProductCategory pc ON (ps.ProductCategoryID=pc.ProductCategoryID AND pc.Name=NBikes) AND i.Quantity 08.1.1 视图概述返回本节首页 2)简化数据操作 视图可以简化用户处理数据的方式。可以将常用联接、投影、UNION 查询和 SELECT 查询定义为视图,
8、以便使用户不必在每次对该数据执行附加操作时指定所有条件和条件限定。例如,可以将一个用于报表目的且执行子查询、外联接和聚合来从一组表中检索数据的复杂查询创建为视图。视图简化了对数据的访问,因为每次生成报表时无需编写或提交基础查询,而是直接查询视图。 尽管不是复杂查询,AdventureWorks 示例数据库中的视图 vBikes 仍允许用户着重于特定数据,而不必构造生成视图所需的 JOIN 子句。 还可以创建用户定义的内联函数,在逻辑上作为参数化视图运行,或者作为在 WHERE 子句搜索条件或查询的其它部分中含有参数的视图运行。8.1.1 视图概述返回本节首页3)提供向后兼容性视图使您能够在表的
9、架构更改时为表创建向后兼容接口。例如,一个应用程序可能引用了具有以下架构的非规范化表:Employee(Name,BirthDate,Salary,Department,BuildingName)若要避免在数据库中重复存储数据,可以通过将该表拆分为下列两个表来规范化该表:Employee2(Name,BirthDate,Salary,DeptId)、Department(DeptId,BuildingName)若要提供仍然引用Employee中的数据的向后兼容接口,可以删除原有的Employee表并用以下视图替换:CREATE VIEW Employee AS SELECT Name,Birt
10、hDate,Salary,BuildingNameFROM Employee2 e,Department d WHERE e.DeptId=d.DeptId此时,用于查询Employee表的应用程序可以从Employee视图中获取它们的数据。如果只从Employee中读取,则不必更改应用程序。通过向新视图添加INSTEAD OF触发器,将对视图的INSERT、DELETE和UPDATE操作映射到基础表,有时也可以支持更新Employee的应用程序。8.1.1 视图概述返回本节首页4)自定义数据视图允许用户以不同方式查看数据,即使在他们同时使用相同的数据时也是如此。这在具有许多不同目的和技术水平
11、的用户共用同一数据库时尤其有用。5)导出和导入数据可使用视图将数据导出到其它应用程序。例如,您可能希望使用 AdventureWorks 数据库中的Customer和SalesOrderHeader表在Microsoft Excel中分析销售数据。为此,可基于 Customer和SalesOrderHeader 表创建视图。然后,使用bcp实用工具导出由该视图定义的数据。如果可以使用 INSERT 语句向视图中插入行,则还可以使用bcp实用工具或BULK INSERT语句将数据从数据文件导入某些视图。6)跨服务器组合分区数据T-SQL UNION集合运算符可在视图内使用,将单独表的两个或多个查
12、询的结果组合到单一的结果集中。这在用户看来是一个单独的表,称为分区视图。例如,如果一个表包含华盛顿的销售数据,另一个表包含加利福尼亚的销售数据,则可以对这两个表使用UNION创建一个视图。该视图代表这两个地区的销售数据。通过使用分区视图,数据的外观象是一个单一表,并且能以单一表的方式进行查询,而无需手动引用正确的基础表。如果满足下列任一条件,则分区视图可被更新:1)具有逻辑的视图定义支持 INSERT、UPDATE和DELETE语句的INSTEAD OF触发器;2)视图和INSERT、UPDATE及DELETE语句均遵循为可更新分区视图定义的规则。8.1.2 创建视图返回本节首页 1、设计视图
13、的准则 在创建视图前请考虑如下准则:1)只能在当前数据库中创建视图。但是,如果使用分布式查询定义视图,则新视图所引用的表和视图可以存在于其它数据库甚至其它服务器中。2)视图名称必须遵循标识符的规则,且对每个架构都必须唯一。此外,该名称不得与该架构包含的任何表的名称相同。3)您可以对其它视图创建视图。SQL Server 2005允许嵌套视图。但嵌套不得超过32层。根据视图的复杂性及可用内存,视图嵌套的实际限制可能低于该值。4)不能将规则或DEFAULT定义与视图相关联(说明视图还是不同于表)。5)不能将AFTER触发器与视图相关联,只有INSTEAD OF触发器可以与之相关联。6)定义视图的查
14、询不能包含产生多结果集的COMPUTE子句或COMPUTE BY子句,也不能包含INTO关键字。7)定义视图的查询不能包含ORDER BY子句,除非在SELECT语句的选择列表中还有一个TOP子句。8)定义视图的查询不能包含指定查询提示的OPTION子句,也不能包含TABLESAMPLE子句。9)不能为视图定义全文索引定义。10)不能创建临时视图,也不能对临时表创建视图。11)不能删除参与到使用SCHEMABINDING子句创建的视图中的视图、表或函数,除非该视图已被删除或更改而不再具有架构绑定。另外,如果对参与具有架构绑定的视图的表执行ALTER TABLE语句,而这些语句又会影响该视图的定
15、义,则这些语句将会失败。12)尽管查询引用一个已配置全文索引的表时,视图定义可以包含全文查询,仍然不能对视图执行全文查询。13)下列情况下必须指定视图中每列的名称:A)视图中的任何列都是从算术表达式、内置函数或常量派生而来;B)视图中有两列或多列原应具有相同名称(通常由于视图定义包含联接,因此来自两个或多个不同表的列具有相同的名称);C)希望为视图中的列指定一个与其源列不同的名称。无论重命名与否,视图列都会继承其源列的数据类型;D)其它情况下,无需在创建视图时指定列名。SQL Server会为视图中的列指定与定义视图的查询所引用的列相同的名称和数据类型。选择列表可以是基表中列名的完整列表,也可
16、以是其部分列表。8.1.2 创建视图返回本节首页 2、设计索引视图的原则 对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图。如果在查询中频繁地引用这类视图,可通过对视图创建唯一聚集索引来提高性能。对视图创建唯一聚集索引后,结果集将存储在数据库中,就像带有聚集索引的表一样。 如果很少更新基础数据,则索引视图的效果最佳。维护索引视图的成本可能高于维护表索引的成本。如果经常更新基础数据,则维护索引视图数据的成本可能超过使用索引视图所带来的性能收益。如果基础数据以批处理的形式定期更新,但在更新之间主要作为只读数据
17、进行处理,请考虑在更新前删除所有索引视图,然后再重新生成。这样做可以提高更新的性能。 对视图创建的第一个索引必须是唯一聚集索引。创建唯一聚集索引后,可以创建其它非聚集索引。视图的索引命名约定与表的索引命名约定相同。唯一的区别是表名替换为视图名。 创建聚集索引后,对于任何尝试修改视图基本数据的连接,其选项设置必须与创建索引所需的选项设置相同。如果执行语句的连接的选项设置不正确,则SQL Server将生成错误,并回滚任何会影响视图结果集的INSERT、UPDATE或DELETE语句。 若删除视图,该视图的所有索引也将被删除。若删除聚集索引,视图的所有非聚集索引和自动创建的统计信息也将被删除。视图
18、中用户创建的统计信息受到维护。非聚集索引可以分别删除。删除视图的聚集索引将删除存储的结果集,并且优化器将重新像处理标准视图那样处理视图。8.1.2 创建视图返回本节首页3、创建视图(1)利用Management Studio创建与修改视图 图8-2 设计视图前选定表 图8-3 交互式设计视图 在Management Studio的对象资源管理器中,展开指定的数据库,点按“视图”,按鼠标右键,从弹出的快捷菜单中选择“新建视图”菜单项,就会出现新建视图对话框,如图8-2,在该对话框中,通过选定一个或多个表,指定多个字段,设定连接或限定条件,最后按 保存工具按钮,并要求给视图取个名称,即完成了视图的
19、创建,请参阅图8-3。在Management Studio的对象资源管理器中修改视图,只要找到该视图后,按鼠标右键,从弹出的快捷菜单中选择“修改”菜单项,均可即时修改,也如图8-3。8.1.2 创建视图返回本节首页(2)使用T-SQL命令创建数据库创建视图的T-SQL命令是CREATE VIEW,掌握该命令的语法结构后,可直接书写命令创建视图。1)利用CREATE VIEW创建视图。创建一个虚拟表,该表以另一种方式表示一个或多个表中的相关数据。CREATE VIEW 必须是查询批处理中的第一条语句。CREATE VIEW语法:CREATE VIEW schema_name.view_name(
20、column,.n ) WITH ,.nAS select_statement WITH CHECK OPTION ;:=ENCRYPTION SCHEMABINDING VIEW_METADATA 例8-1 创建视图View_S_SC,要求显示出学生的学号、姓名、课程号与该课程成绩。其命令为:CREATE VIEW View_S_SC as select S.Sno,S.SN,S.SEX,SC.Cno,SC.SCOREfrom S inner join SC on S.Sno=SC.Sno8.1.2 创建视图返回本节首页2)通过模板创建视图对CREATE VIEW命令不熟悉的话,还可利用SQ
21、L SERVER 2005提供的命令模板,产生创建视图的命令脚本,修改参数后执行即可。方法为:1)在标准工具栏上单击模板资源管理器按钮 ,在Management Studio右边,能出现的模板资源管理器;2)展开“View”节点。其中包含了关于视图的一些模板如:Create Indexed View、Create View、Drop View等;3)双击模板“Create View”,出现“连接到数据库引擎”对话框,指定连接信息后按“连接”按钮,在打开的新查询窗口中已生成了创建标准视图脚本。脚本中含有待替换的参数;4)在“SQL编辑器”工具条上按“指定模板参数的值” 工具按钮。 点选后出现“指
22、定模板参数的值”对话框,给各参数指定值后,按“确定”按钮,仔细确认后可按 按钮分析代码的语法结构,按 按钮执行脚本,顺利的话一个你要的视图好了。8.1.3 使用视图返回本节首页视图的使用基本同基本表的使用,不同处是有些视图是不可更新的,只能对这些不可更新视图作查询操作,不能通过它们更新数据。您可以通过视图修改基表的数据,修改方式与通过UPDATE、INSERT和DELETE语句或使用bcp实用工具和BULK INSERT语句修改表中数据的方式一样。但是,以下限制应用于更新视图,但不应用于表:1)任何修改(包括 UPDATE、INSERT和DELETE 语句)都只能引用一个基表的列。2)视图中被
23、修改的列必须直接引用表列中的基础数据。它们不能通过其它方式派生,例如通过:聚合函数(AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR和VARP)。计算,不能通过表达式并使用列计算出其它列。使用集合运算符(UNION、UNION ALL、CROSSJOIN、EXCEPT和INTERSECT)形成的列得出的计算结果不可更新。3)正在修改的列不受GROUP BY、HAVING或DISTINCT子句的影响。上述限制应用于视图的FROM子句中的任何子查询,就像其应用于视图本身一样。通常,SQL Server必须能够明确跟踪从视图定义到一个基表的修改。例如,以
24、下视图不可更新: 8.1.3 使用视图返回本节首页CREATE VIEW TotalSalesContacts AS SELECT C.LastName,SUM(O.TotalDue) AS TotalSales FROM Sales.SalesOrderHeader O,Person.Contact C WHERE C.ContactID=O.ContactID GROUP BY LastName对TotalSalesContacts的LastName列所做的修改是不可接受的,因为该列已受到GROUP BY子句的影响。如果有多个具有相同姓氏的实例,则SQL Server将无法得知要 UPDA
25、TE、INSERT或DELETE哪一个实例。同样,尝试修改TotalSalesContacts的TotalSales列将返回错误,因为此列是由聚合函数派生而来的。SQL Server无法直接跟踪此列到其基表(SalesOrderHeader)。另外还将应用以下附加准则:1)如果在视图定义中使用了WITH CHECK OPTION子句,则所有在视图上执行的数据修改语句都必须符合定义视图的SELECT语句中所设置的条件。如果使用了WITH CHECK OPTION子句,修改行时需注意不让它们在修改完成后从视图中消失。任何可能导致行消失的修改都会被取消,并显示错误。2)INSERT语句必须为不允许空
26、值并且没有DEFAULT定义的基础表中的所有列指定值。3)在基础表的列中修改的数据必须符合对这些列的约束,例如为空性、约束及DEFAULT定义等。例如如果要删除一行,则相关表中的所有基础FOREIGN KEY约束必须仍然得到满足,删除操作才能成功。4)不能使用由键集驱动的游标更新分布式分区视图(远程视图)。此项限制可通过在基础表上而不是在视图本身上声明游标得到解决。8.1.3 使用视图返回本节首页不能对视图中的text、ntext或image列使用READTEXT语句和WRITETEXT语句。如果以上限制使您无法直接通过视图修改数据,请考虑以下选项:使用具有支持 INSERT、UPDATE和D
27、ELETE语句的逻辑的INSTEAD OF触发器;使用修改一个或多个成员表的可更新分区视图。图8-4交互式打开视图后,显示的视图记录如图8-5,通过图8-4打开的视图能直接更新数据,更新的数据将最终更新到视图View_S_SC基于的基本表S或SC中,请你试试。当然,你也可以象对基本表一样,通过命令操作可更新视图View_S_SC。如下是举例的命令序列,可同时运行如下命令,查看表数据的变化情况。select * from SC where sno=S2 and cno=C3 - 先查询S2学生选课程C3的记录情况。select * from View_S_SC where sno=S2 - 通过
28、视图查询S2学生的信息及选课情况。- 通过视图修改S2学生选课程C3的成绩,改为83。update View_S_SC set score=82 where sno=S2 and cno=C3- 再次通过视图查询S2学生的信息及选课情况,应该发现选课程C3的成绩改变了。select * from View_S_SC where sno=S2select * from SC where sno=S2 and cno=C3 -能发现真正的成绩修改在SC表中发生了。8.1.3 使用视图返回本节首页 图8-4 交互式打开视图 图8-5 打开的视图8.1.4 视图定义信息的查阅返回本节首页 1、使用Ma
29、nagement Studio查阅视图定义信息图8-6 查看编写视图的脚本 查看视图(未加密的)创建的脚本的方法是:选中某视图,右键菜单“编写视图脚本为”“CREATE到”“新查询编辑器窗口”,如图8-6所示。 如图8-6所示,通过交互式菜单能对视图实现“查看依赖关系”、“重命名”、“删除”等操作,“属性”菜单能查看到视图的多种相关信息。8.1.4 视图定义信息的查阅返回本节首页 2、命令方式查阅视图的相关信息 如果更改视图所引用对象的名称,则必须更改视图,使其文本反映新的名称。因此,在重命名对象之前,首先显示该对象的依赖关系,以确定即将发生的更改是否会影响任何视图。 获取有关视图信息的系统视
30、图有:sys.views、sys.columns等。sp_helptext也能查阅到视图的相关信息。 查看视图定义的数据可通过SELECT命令、显示视图的依赖关系的系统视图sys.sql_dependencies等。例如:要查看视图employees_view的创建脚本,实现命令为:sp_helptext dbo.employees_view。获取有关视图信息的SQL命令:select * from sys.views - 查看视图名等信息select * from sys.columns - 查看列名信息select object_name(object_id) as 对象,object_n
31、ame(referenced_major_id) as 依赖对象 from sys.sql_dependencies - 显示对象与依赖对象的关系8.1.5 视图的修改与删除 返回本节首页 下面来说明如何修改视图定义以及删除视图等操作。 1、修改和重命名视图 视图定义之后,您可以更改视图的名称或视图的定义而无需删除并重新创建视图。删除并重新创建视图会造成与该视图关联的权限丢失。在重命名视图时,请考虑以下原则:1)要重命名的视图必须位于当前数据库中;2)新名称必须遵守标识符规则;3)仅可以重命名具有其更改权限的视图;4)数据库所有者可以更改任何用户视图的名称。 修改视图并不会影响相关对象(例如,
32、存储过程或触发器),除非对视图定义的更改使得该相关对象不再有效。例如,AdventureWorks数据库中的employees_view 视图的定义为:CREATE VIEW employees_view AS SELECT EmployeeID FROM HumanResources.Employee- 存储过程 employees_proc 的定义为:(基于视图创建存储过程)CREATE PROC employees_proc AS SELECT EmployeeID from employees_view- 将 employees_view 修改为检索 LastName 列而不是 Emp
33、loyeeID:ALTER VIEW employees_view AS SELECT LastName FROM Person.Contact c JOIN HumanResources.Employee e ON c.ContactID = e.ContactID此时执行employees_proc将失败,因为该视图中已不存在EmployeeID列。8.1.5 视图的修改与删除 返回本节首页 也可以修改视图以对其定义进行加密,或确保所有对视图执行的数据修改语句都遵循定义视图的SELECT语句中设定的条件集。例如:select * from sys.syscomments where tex
34、t like %employees_view%- 上一语句能查看到视图employees_view的定义信息ALTER VIEW employees_view with ENCRYPTION AS SELECT LastName FROM Person.Contact cJOIN HumanResources.Employee e ON c.ContactID=e.ContactIDselect * from sys.syscomments where text like %employees_view%- 加密后,上一语句已不能查看到视图的定义信息,起到了加密作用。重命名视图employee
35、s_view为employee_view的命令是:EXEC sp_rename employees_view,employee_view;2、删除视图在创建视图后,如果不再需要该视图,或想清除视图定义及与之相关联的权限,可以删除该视图。删除视图后,表和视图所基于的数据并不受到影响。任何使用基于已删除视图的对象的查询将会失败,除非创建了同样名称的一个视图(并且包含所需列)。1)在Management Studio中删除视图展开某数据库后,展开“视图”节点,选中要删除的视图鼠标右键,弹出快捷菜单点击“删除”菜单项在出现的确认删除对话框中,按“确认”按钮。2)利用drop view语句删除视图,dr
36、op view语法:DROP VIEW view,.n例8-4 删除视图employees_view的命令为:DROP VIEW dbo.employees_view。8.2 索引 8.2.1 了解索引8.2.2 创建索引8.2.3 修改索引8.2.4 查看索引信息8.2.5 删除索引 返回本节首页8.2 索引 返回本节首页 与书目录的作用相同,数据库中的索引使您可以快速找到表或索引视图中的特定信息。索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针。通过创建设计良好的索引以支持查询,可以显著提高数据库查询和应用程序的性能。索引可以减少为返回查询结果集而必须读取的数据
37、量。索引还可以强制表中的行具有唯一性,从而确保表数据的数据完整性。8.2.1 了解索引返回本节首页1、索引基础知识索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。表或视图的索引可以粗分为以下两大类:1)聚集,聚集索引根据数据行的键值在表或视图中排序和存储而确定的。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如
38、果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。2)非聚集,非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。8.2.1 了解索引返回本节首页(1)索引类型SQL Server 2005中可用的索引类型常细分为如下7类:1)聚集索引:聚集索引基于聚集索引键按顺序排序和存储表或视图中的数据行。聚集索引按 B 树索引结构实现,B 树索引结构支持基于聚集索引键值
39、对行进行快速检索。2)非聚集索引:既可以使用聚集索引来为表或视图定义非聚集索引,也可以根据堆来定义非聚集索引。非聚集索引中的每个索引行都包含非聚集键值和行定位符。此定位符指向聚集索引或堆中包含该键值的数据行。索引中的行按索引键值的顺序存储,但是不保证数据行按任何特定顺序存储,除非对表创建聚集索引。3)唯一索引:唯一索引确保索引键不包含重复的值,因此,表或视图中的每一行在某种程度上是唯一的。聚集索引和非聚集索引都可以是唯一索引。4)包含性列索引:一种非聚集索引,它扩展后不仅包含键列,还包含非键列。5)索引视图:视图的索引将具体化(执行)视图,并将结果集永久存储在唯一的聚集索引中,而且其存储方法与
40、带聚集索引的表的存储方法相同。创建聚集索引后,可以为视图添加非聚集索引。6)全文索引:一种特殊类型的基于标记的功能性索引,由SQL Server全文引擎(MSFTESQL)服务创建和维护。用于帮助在字符串数据中搜索复杂的词。7)XML索引:xml数据类型列中XML二进制大型对象(BLOB)的已拆分持久表示形式。8.2.1 了解索引返回本节首页 2、设计索引 面对一张张表如何设计出高效索引呢?下面根据不同索引类型作一说明。 (1)索引设计基础知识 索引设计不佳和缺少索引是提高数据库和应用程序性能的主要障碍。设计高效的索引对于获得良好的数据库和应用程序性能极为重要。为数据库及其工作负荷选择正确的索
41、引是一项需要在查询速度与更新所需开销之间取得平衡的复杂任务。如果索引较窄,或者说索引关键字中只有很少的几列,则需要的磁盘空间和维护开销都较少。而另一方面,宽索引可覆盖更多的查询。您可能需要试验若干不同的设计,才能找到最有效的索引。可以添加、修改和删除索引而不影响数据库架构或应用程序设计。因此,便于对索引做试验与优选。 SQL Server 2005中的查询优化器可在大多数情况下可靠地选择最高效的索引。总体索引设计策略应为查询优化器提供可供选择的多个索引,并依赖查询优化器做出正确的决定。这在多种情况下可减少分析时间并获得良好的性能。若要查看查询优化器对特定查询使用的索引,请在Management
42、 Studio中的“查询”菜单上选择“包括实际的执行计划”。 不要总是将索引的使用等同于良好的性能,或者将良好的性能等同于索引的高效使用。如果只要使用索引就能获得最佳性能,那查询优化器的工作就简单了。但事实上,不正确的索引选择并不能获得最佳性能。因此,查询优化器的任务是只在索引或索引组合能提高性能时才选择它,而在索引检索有碍性能时则避免使用它。8.2.1 了解索引返回本节首页(2)常规索引设计指南经验丰富的数据库管理员能够设计出好的索引集,但是,即使对于不特别复杂的数据库和工作负荷来说,这项任务也十分复杂、耗时和易于出错。了解数据库、查询和数据列的特征可以帮助您设计出最佳索引。设计索引时,应考
43、虑以下数据库准则:1)一个表如果建有大量索引会影响INSERT、UPDATE和DELETE语句的性能,因为在表中的数据更改时,所有索引都须进行适当的调整。2)避免对经常更新的表进行过多的索引,并且索引应保持较窄,就是说列要尽可能少。3)使用多个索引可以提高更新少而数据量大的查询的性能。大量索引可以提高不修改数据的查询(例如SELECT语句)的性能,因为查询优化器有更多的索引可供选择,从而可以确定最快的访问方法。4)对小表进行索引可能不会产生优化效果,因为查询优化器在遍历用于搜索数据的索引时,花费的时间可能比执行简单的表扫描还长。因此,小表的索引可能从来不用,但仍必须在表中的数据更改时进行维护。
44、5)视图包含聚合、表联接或聚合和联接的组合时,视图的索引可以显著地提升性能。若要使查询优化器使用视图,并不一定非要在查询中显式引用该视图。6)使用数据库引擎优化顾问来分析数据库并生成索引建议。8.2.2 创建索引返回本节首页1、创建索引的一般方法确定最佳的创建方法。按照以下方法创建索引:1)使用CREATE TABLE或ALTER TABLE对列定义PRIMARY KEY或UNIQUE约束;2)使用CREATE INDEX语句或Management Studio对象资源管理器中的“新建索引”对话框创建独立于约束的索引。必须指定索引的名称、表以及应用该索引的列。还可以指定索引选项和索引位置、文件
45、组或分区方案。默认情况下,如果未指定聚集或唯一选项,将创建非聚集的非唯一索引。要考虑的一个重要因素是对空表还是对包含数据的表创建索引。对空表创建索引在创建索引时不会对性能产生任何影响,而向表中添加数据时,会对性能产生影响。对大型表创建索引时应仔细计划,这样才不会影响数据库性能。对大型表创建索引的首选方法是先创建聚集索引,然后创建任何非聚集索引。在对现有表创建索引时,请考虑将ONLINE选项设置为ON。该选项设置为ON时,将不持有长期表锁以继续对基础表的查询或更新。下表列出了应用于聚集索引、非聚集索引和XML索引的最大值。除非另有指定,否则下列限制应用于所有索引类型。8.2.2 创建索引返回本节
46、首页(1)在Management Studio中创建索引图8-7 “索引/键”对话框 在Management Studio的对象资源管理器中创建索引的步骤为: 对要创建索引的表打开表设计器窗口,然后利用“表设计器”菜单或“表设计器”上鼠标右键的快捷菜单中的“索引/键”菜单项,也可以直接按“表设计器”工具栏上的“管理索引和键”按钮。在出现的“索引/键”对话框(如图8-7所示)上,能方便地“添加”或“删除”索引或键,当添加索引或键时,“索引/键”对话框左边,添加了缺省索引名,右边对该索引指定了缺省属性,如索引列、是否唯一、索引名、创建为聚集、索引说明等等。你可以逐项设置或修改,完成后按“关闭”按钮
47、。退出到“表设计器”后,要使对索引或键的修改有效,注意一定要保存,即在退出“表设计器”前要按标准工具栏上的“保存”工具按钮或点击“文件”菜单中的“保存”菜单项。 8.2.2 创建索引返回本节首页(2)CREATE INDEX命令CREATE INDEX命令可以为指定表或视图创建关系索引,或为指定表创建 XML 索引。可在向表中填入数据前创建索引。可通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。CREATE INDEX命令的语法为:Create Relational Index:CREATE UNIQUE CLUSTERED|NONCLUSTERED INDEX index_na
48、me ON (column ASC|DESC,.n)INCLUDE(column_name,.n) WITH (,.n ) ON partition_scheme_name(column_name)|filegroup_name|default;:=database_name.schema_name.|schema_name.table_or_view_name:=PAD_INDEX=ON|OFF|FILLFACTOR=fillfactor|SORT_IN_TEMPDB=ON|OFF|IGNORE_DUP_KEY=ON|OFF|STATISTICS_NORECOMPUTE=ON|OFF|DRO
49、P_EXISTING=ON|OFF|ONLINE=ON|OFF|ALLOW_ROW_LOCKS=ON|OFF|ALLOW_PAGE_LOCKS=ON|OFF|MAXDOP=max_degree_of_parallelismCreate XML Index:CREATE PRIMARY XML INDEX index_name ON ( xml_column_name ) USING XML INDEX xml_index_name FOR VALUE|PATH|PROPERTY WITH(,.n);向后兼容的CREATE INDEX:CREATE UNIQUE CLUSTERED | NONC
50、LUSTERED INDEX index_name ON ( column_name ASC|DESC,.n) WITH ,.n ON filegroup_name | default :=database_name.owner_name.|owner_name.table_or_view_name:= PAD_INDEX | FILLFACTOR = fillfactor | IGNORE_DUP_KEY | DROP_EXISTING | STATISTICS_NORECOMPUTE | SORT_IN_TEMPDB8.2.2 创建索引返回本节首页例8-7 对S表的DEPT字段降序建立非聚
51、集索引,索引名为S_DEPT_index,命令为:create nonclustered index S_DEPT_index on S(DEPT desc)。例8-8 创建简单非聚集组合索引以下示例为Sales.SalesPerson表的SalesQuota和SalesYTD列创建非聚集组合索引。IF EXISTS(SELECT name FROM sys.indexes WHERE name=NIX_SalesPerson_SalesQuota_SalesYTD) - 若已存在先删除 DROP INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sale
52、s.SalesPerson ;CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson(SalesQuota,SalesYTD);例8-9 创建唯一非聚集索引以下示例为Production.UnitMeasure表的Name列创建唯一的非聚集索引。该索引将强制插入Name列中的数据具有唯一性。CREATE UNIQUE INDEX AK_UnitMeasure_Name ON Production.UnitMeasure(Name);以下查询通过尝试插入与现有行包含相同值的一行来测试唯一性
53、约束。SELECT Name FROM Production.UnitMeasure WHERE Name=NOunces;INSERT INTO Production.UnitMeasure(UnitMeasureCode,Name,ModifiedDate) VALUES(OC, Ounces, GetDate(); - 执行后将得到错误信息,插入失败。8.2.2 创建索引返回本节首页例8-12 创建主XML索引以下示例为Production.ProductModel表的CatalogDescription列创建主XML索引。CREATE PRIMARY XML INDEX PXML_Pr
54、oductModel_CatalogDescription ON Production.ProductModel(CatalogDescription);例8-13 创建辅助XML索引,本例为Production.ProductModel表的CatalogDescription列创建辅助XML索引。CREATE XML INDEX IXML_ProductModel_CatalogDescription_Path ON Production.ProductModel (CatalogDescription) USING XML INDEX PXML_ProductModel_CatalogDe
55、scription FOR PATH;例8-14 创建已分区索引,本例为现有分区方案TransactionsPS1创建非聚集已分区索引。此示例假定安装了已分区索引示例。CREATE NONCLUSTERED INDEX IX_TransactionHistory_ReferenceOrderID ON Production.TransactionHistory(ReferenceOrderID) ON TransactionsPS1(TransactionDate);4、索引的使用索引一般用户不能直接使用,而是由DBMS自动引用。SQL Server 2005查询优化器是主要使用索引者,查询优
56、化器在多数情况下可靠地选择最高效的索引。总体索引设计策略应为查询优化器提供更多的索引选择机会,并支持其做出正确的决定。这在各种情形下可减少分析时间并取得较好的性能。8.2.3 修改索引返回本节首页在SQL Server 2005中,可以通过使用ALTER INDEX语句或对象资源管理器执行常规索引维护任务。其语法为:ALTER INDEX index_name |ALL ON REBUILD WITH ( ,.n ) | PARTITION = partition_number WITH ( ,.n)| DISABLE |REORGANIZE PARTITION=partition_numbe
57、r WITH (LOB_COMPACTION=ON|OFF) | SET (,.n );以下举例说明:例8-15 重新生成索引,本示例在Employee表中重新生成单个索引。ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD;例8-16 重新生成表的所有索引并指定选项,本示例指定了ALL关键字。这将重新生成与表相关联的所有索引。其中指定了三个选项。ALTER INDEX ALL ON Production.Product REBUILD WITH (FILLFACTOR=80, SORT_IN_TEMPDB
58、 =ON,STATISTICS_NORECOMPUTE=ON);例8-17 通过LOB压缩重新组织索引,本示例重新组织单个聚集索引。因为该索引在叶级别包含LOB数据类型,所以该语句还会压缩所有包含该大型对象数据的页。ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto REORGANIZE;例8-18 设置索引的选项,本例为索引AK_SalesOrderHeader_SalesOrderNumber设置了几个选项。ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber
59、 ON Sales.SalesOrderHeader SET ( STATISTICS_NORECOMPUTE=ON,IGNORE_DUP_KEY=ON,ALLOW_PAGE_LOCKS=ON);8.2.3 修改索引返回本节首页 1、禁用索引 禁用索引可防止用户访问该索引,对于聚集索引,还可防止用户访问基础表数据。索引定义保留在元数据中,非聚集索引的索引统计信息仍保留。对视图禁用非聚集索引或聚集索引会以物理方式删除索引数据。禁用表的聚集索引可以防止对数据的访问,数据仍保留在表中,但在删除或重新生成索引之前,无法对这些数据执行 DML 操作。若要重新生成并启用已禁用的索引,请使用 ALTER I
60、NDEX REBUILD 语句或 CREATE INDEX WITH DROP_EXISTING 语句。在以下情况中可能禁用一个或多个索引:1)SQL Server 2005 Database Engine在SQL Server升级期间自动禁用索引。2)使用ALTER INDEX 手动禁用索引。 例8-19 禁用索引,本例禁用了对Employee表的非聚集索引。 ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee DISABLE ; 例8-20 禁用约束,本例通过禁用PRIMARY KEY索引来禁用PRIMARY KEY约束
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 哈姆雷特:人性与命运的永恒叩问
- 大模型推理性能优化工程师考试试卷及答案
- 2026年绿色工厂创建考试真题及答案
- 2026 高血压病人饮食的冬瓜粥课件
- 2026年宁夏回族自治区初二地生会考真题试卷+解析及答案
- 2025年安徽六安市初二地生会考考试真题及答案
- 江苏宿迁市地理生物会考真题试卷(+答案)
- 2026年湖北省咸宁市初二地理生物会考试卷题库及答案
- 2026九年级道德与法治上册 网络强国建设
- 2026一年级下新课标口算笔算结合训练
- 2026年新党章全文测试题及答案
- 2026年新版gcp道考前冲刺测试卷【易错题】附答案详解
- 译林版英语五年级下册Unit 4 (story time)
- 北京四中2025学年七年级下学期期中英语试卷及答案
- (甘肃二模)甘肃省2026年高三年级第二次模拟考试政治试卷(含答案)
- 2026年工业设计入学考试试题及答案
- 2026届浙江省杭州市高三二模英语试题(含答案和音频)
- 2026《中华人民共和国教育法》试题库及答案
- 2026年北京市朝阳区高三一模历史试卷(含答案)
- 山东省滨州市2026届高三年级一模考试地理(滨州一模)+答案
- 毕业设计(伦文)-乘用车转向系统设计
评论
0/150
提交评论