SQL Server视图:创建索引和添加基础数据

日期: 2013-11-27 作者:Robert Sheldon翻译:Ranma 来源:TechTarget中国 英文

本文是关于SQL Server视图的第二篇文章。本文将介绍如何添加索引和更新基础数据。第一篇文章介绍了SQL Server视图的概念并演示了如何创建它们。 只要你能满足一些条件就可以在SQL Server视图上创建索引。

例如,你必须保证视图中所有的表上都正确配置了SET选项。另外,此视图的查询必须是确定的;而且当输入值重复的情况下,此查询必须返回相同的结果。打个比方,你不能在查询中使用getdate()函数,因为这样的话返回值总是不同。此外,你必须在视图定义中始终包含WITH SCHEMABINDING语句。

如果你想要在一个视图上创建索引,这些仅仅是一些需要考虑的注意事项。对于更详细的要求,……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

本文是关于SQL Server视图的第二篇文章。本文将介绍如何添加索引和更新基础数据。第一篇文章介绍了SQL Server视图的概念并演示了如何创建它们。

只要你能满足一些条件就可以在SQL Server视图上创建索引。例如,你必须保证视图中所有的表上都正确配置了SET选项。另外,此视图的查询必须是确定的;而且当输入值重复的情况下,此查询必须返回相同的结果。打个比方,你不能在查询中使用getdate()函数,因为这样的话返回值总是不同。此外,你必须在视图定义中始终包含WITH SCHEMABINDING语句。

如果你想要在一个视图上创建索引,这些仅仅是一些需要考虑的注意事项。对于更详细的要求,请参考TechNet的文章《创建索引视图》

你在视图上创建的第一个索引必须是唯一聚簇索引。在添加了此索引之后,你可以创建非聚簇索引。不过要记住,如果数据更新频繁,那么你可能不想索引化一个视图,因为索引本身会不断更新,这就会影响其他操作的性能。但是如果源数据是相对稳定的,那么索引化视图可以显著提高查询性能。例如,假设在第一部分的例子中当我们执行了 SELECT语句的时候我们便生成了一个执行计划。图1显示了此执行计划的外观。

图1:非索引视图在查询此视图时访问基础表

这是一个相当基本的查询。没有源表是索引化的,因此数据库引擎会执行表扫描来检索数据。但即使表被索引化了,数据库引擎必须查询两个表然后将数据连接在一起。现在,我们在表上创建一个索引。以下语句在视图的EmployeeID字段上定义了一个唯一聚簇索引:

正如你所看到的,在一个视图上创建索引与在一个表上创建索引类似。如果在索引创建好后我们想要返回相同查询,我们就要有一个不同的执行计划,如图2中所示。

图2:当视图被查询时索引视图不会访问基础表

在这样的简单场景中,执行会更加简洁。只需要访问聚簇索引来返回数据。当然,比起此处所展示的内容来说,衡量性能是一个更加复杂的问题。决定是否要索引化一个视图取决于你是如何查询和修改数据以及查询的复杂性的,但是在某些情况下,一个索引化视图可以对性能产生显著提升。

使用视图来更新基础数据

在某些情况下,你可以使用视图来修改由此视图所引用的表中的数据。而对于索引化视图来说,有很多规则来限制你更新数据的能力。例如,无论此视图引用了多少表,你每次只能在一个表上修改数据。此外,只有数据库引擎能明确追踪底层基表的视图定义中的字段的情况下,你才能通过一个视图来修改数据。例如,你不能更新分组化和聚合化的数据。(对于更多关于限制你通过视图更新数据能力的信息,请再次参阅SQL Server联机丛书上的文章《创建视图(Transact-SQL)》。

假设你满足了所有要通过视图更新数据的要求,那么之后的过程就会非常简单并且与直接在一个表中修改数据是类似的。例如,下面的UPDATE 语句更新了一名雇员的职位。

正如你所看到的,我们在UPDATE 语句中可以像引用一个表一样引用视图。接着我们使用SET 语句来提供更新后的值,并用WHERE 语句来指定要更新哪条记录。注意我们可以使用CurrentEmployee 表中的FirstName 和LastName 值来更新EmployeeInfo表中的JobTitle字段。由于这两个表是通过视图连接的,那么在我们更新数据的时候就不用连接这两个表了。

我们还可以使用视图来插入数据。例如,以下的 INSERT INTO语句使用vEmployees 视图来添加了一个新雇员:

你可以从视图定义回想一下,此视图的EmployeeID字段是直接映射到CurrentEmployee表中的BusinessEntityID字段的,此表包含FirstName和LastName两个字段。我们可以执行此更新是因为所有三个字段是在同一个表中的。如果我们还要尝试添加一个职位和雇佣日期的话,那么我们的语句就会失败。

与SQL Server共事

视图为向用户和他们的应用程序公开SQL Server数据提供了一个有价值的工具。它们简化了底层数据结构并提供了一个额外安全层。它们可以索引化来改善性能并且甚至可以用来修改数据。另外,视图从SQL Server的一个版本到下一个版本可以很容易地定义接口。实际上,自SQL Server 2000以来,基本的CREATEVIEW语法并没有改变。显然,你可以通过在你的SQL Server数据库中应用视图来获得很多东西。它们易于创建和使用。如果你能写一条SELECT语句,那么你就可以定义一个视图。

翻译

Ranma
Ranma

相关推荐

  • 如何创建SQL Server视图

    在SQL Server数据库中你可以创建的对象之一就是视图,它是可以从一个或多个表(或其他视图)中检索数据的虚拟表,此过程类似于用一条SELECT语句返回一个数据集。

  • 处理SQL Server 2000索引碎片技巧(三)

    如何处理SQL Server 2000索引碎片?本文介绍了处理SQL Server 2000索引碎片技巧中的三大技巧:确定碎裂的索引、重建碎裂的索引以及配置数据库……

  • 处理SQL Server 2000索引碎片技巧(二)

    SQL Server 2000索引碎片有哪些处理技巧?文中概述了SQL Server 2000索引碎片处理的两种技巧:分析索引和理解如何创建索引,作者对这两种技巧进行了详细讲解。

  • 为文本数据创建索引的更好方法

    怎样为文本数据创建索引?有什么更好的方法?为文本数据(varchar、nvarchar、char等)创建索引是一种很好的实现更快数据查询的方法。然而,这些索引会给存储索引的……