使用SQL视图的充分理由是什么?


98

我正在阅读SQL Server 2008圣经,并且涵盖了视图部分。但是作者确实没有解释观点的目的。视图有什么用?我应该在我的网站上使用它们吗?它们有什么好处?


您能否提供“ SQL Server 2008圣经”这本书的数据库文件?作者的网站已死,我无法联系到他。

Answers:


92

以前的答案似乎都没有提到的另一种用法是更易于部署表结构更改。

假设您希望停用T_OLD包含活动用户数据的表(),而改用一个具有相似数据(名为T_NEW)的新表,但同时包含活动用户和非活动用户的数据,并增加一列active

如果您的系统中有大量的查询,则SELECT whatever FROM T_OLD WHERE whatever有两种选择可用于展开:

1)Cold Turkey-更改数据库,同时更改,测试和发布包含所述查询的大量代码。很难做到(甚至协调),非常冒险。坏。

2)渐进式 -通过创建T_NEW表,删除T_OLD表并创建一个名为VIEW的VIEW来更改数据库,该VIEWT_OLD模仿T_OLD表100%(例如,视图查询为SELECT all_fields_except_active FROM T_NEW WHERE active=1)。

这样一来,您就可以避免释放当前从中选择的任何代码T_OLD,并进行更改以将代码从轻松地迁移T_OLDT_NEW

这是一个简单的示例,还有很多其他方面。

PS另一方面,您可能应该有一个存储过程API,而不是来自的直接查询T_OLD,但这并非总是如此。


3
我不了解术语“存储过程API”及其相关的优点/缺点,并发现本文很有帮助:codinghorror.com/blog/2005/05/…–
Jeff Widman

抱歉,我参加聚会晚了,但是表演呢。如果我需要在原始表上进行联接,而是改为联接视图,它将使用最佳执行计划吗?
Zikato

@Zikato是的,如果它是索引视图
LinkBerest

V好指示
阿夫南·艾哈迈德

47

(摘自Google搜索中出现的第一个教程(链接现已失效),但是它具有我本人手动键入的所有优点。)

视图具有以下优点:

  • 安全性-可以使用户可以访问视图,而不能直接访问基础表。这样,DBA可以仅向用户提供所需的数据,同时保护同一表中的其他数据。
  • 简单-视图可用于隐藏和重用复杂的查询。
  • 列名简化或澄清-视图可用于在列名上提供别名,以使其更容易记忆和/或更有意义。
  • 垫脚石-视图可以在“多级”查询中提供垫脚石。例如,您可以创建一个查询视图,以计算每个销售人员的销售数量。然后,您可以查询该视图,以按销售人员的销售数量分组销售人员。

因为我喜欢您的答案,并且看不到很多要点,所以我可以建议您在列表中再添加两个吗?索引视图可以提高性能。针对视图运行更新而不是直接对表运行可以使您更有信心,不会误更新该关键生产表:)
David Hall 2010年

列表中的另一点是,大多数DBA都希望使用视图,因为它们可以调整一个视图,并且大部分(并非总是)使用该视图的所有查询都将被调整。
Nitin Midha

这是我书中99%的答案。
John Steedman

BTW @David断链
曼努埃尔·乔丹

最后一点,我们不能为此使用临时表吗?
杰超王

16

维基百科的一些原因:

视图可以提供优于表的优势:

  1. 视图可以表示表中包含的数据的子集
  2. 视图可以将多个表合并并简化为一个虚拟表
  3. 视图可以充当汇总表,数据库引擎可以汇总数据(总和,平均值等),并将计算结果作为数据的一部分呈现
  4. 视图可以隐藏数据的复杂性 ; 例如,一个视图可能显示为Sales2000或Sales2001,对实际的基础表进行透明分区
  5. 视图只占用很小的空间;数据库仅包含视图的定义,而不包含其提供的所有数据的副本
  6. 根据使用的SQL引擎,视图可以提供额外的安全性
  7. 视图可以限制一个表或多个表暴露于外部世界的程度

14

VIEWS可以用作SELECT / CODE的可重用部分,可以包含在要联接的其他选择/查询中,并且可以使用各种不同的过滤器,而不必每次都重新创建整个SELECT。

这也将逻辑放在单个位置,因此您不必在整个代码库中都进行更改。

看一下

在存储过程,函数,视图,触发器,内联SQL之间选择

视图的主要优点在于,它在大多数情况下都可以像表一样使用,但是与表不同,它可以封装非常复杂的计算和常用联接。除了存储过程,它还可以使用数据库中几乎所有对象。当您总是需要连接同一组表(例如带有订单明细的订单)以获取摘要计算字段等时,视图最有用。


6
对此要非常小心。如果使用调用其他视图的视图,则会造成巨大的性能混乱。
HLGEM 2011年

10

视图是一个抽象层,它执行任何好的抽象层所要做的工作,包括封装数据库模式并保护您免受更改内部实现细节的后果。

这是一个界面。


1
只要您不堆叠视图上的视图以进行进一步的抽象即可。
HLGEM 2011年

我想我已经有效地否定了关系数据库中的任何类型的多层抽象。而且,我也不从存储过程中调用存储过程。:)
dkretz 2011年

3

这是使用视图按某些条件约束实体的一种非常常见的用法。

表:USERS包含所有用户

视图:ACTIVE_USERS包含所有用户,但不包括那些被暂停,禁止,等待激活并且不满足您将来可能选择定义为活动需求一部分的条件的用户。如果您选择不这样做,则不必从USERS表中删除任何行,因为ACTIVE_USERS始终可以隐藏不需要的行。

这样,您可以使用用户管理页面中的表,但应用程序的其余部分可以使用ACTIVE_USERS,因为它们可能是唯一应该能够执行流程和访问/修改数据的用户。


2

通过视图,您可以合并来自多个不同表的数据并对其进行格式化(合并字段,提供更有意义的字段名称等),以便最终用户更轻松地使用。它们是数据库模型的抽象。它们还可以用于为用户提供对表中数据的访问权限,而无需直接对表本身进行访问。


2

以下是使用视图而不是直接使用表的许多原因

  • 简单-视图可用于隐藏复杂的查询。
  • 安全性-视图可以通过在某些选定的列上创建视图来向最终用户隐藏一些重要信息
  • 安全性-保护表以使用VIEW更改其结构。
  • 冗余-使用通用视图减少每个过程/查询中的冗余代码。
  • 计算-所有计算都可以在视图查询中完成一次。
  • 有意义的名称-表可能具有ID的名称,例如tbl_org_emp_id,可以使用别名,例如[Employee No]或某些有意义的名称。

来自imexploring.com


1

一小部分常见原因/用途:

  • 使用它们来更改数据的格式或“外观”(即,您可以将名字和姓氏结合在一起)

    对数据执行计算或其他查找

    反规范化数据(将多个表中的数据提取到一个位置)


-6

意见是邪恶的!尽可能避免使用它们,并且仅出于DVK提及的原因使用-临时数据迁移。

您应该理解,在具有100个表的数据库中,很难记住每个表的用途。现在,如果您在此处添加另外300个视图,则将变成一团糟。比“视图爱好者”更倾向于使用嵌套视图,然后在存储过程中使用嵌套视图。我现在个人使用一个数据库,其中的视图嵌套了4次深度!因此,要了解存储过程的最简单逻辑,我必须首先浏览所有视图。


8
-1视图很好。如果您使用不当,它们可能会变得邪恶-但这对任何事情都是如此。
NullUserException 2011年

1
如果使用不当,视图可能是邪恶的。经常使用不当的人似乎是那些使用它们来抽象事物然后按照您所说的去做的人,调用视图来调用视图,这些视图将视图调用到您可能需要实现1000万个retro的点,然后返回结果一组3个视图。直接调用表的视图可能非常有用。
HLGEM

@HGLEM是否可以限制其他视图的视图调用?
伊戈尔·索洛伊登科
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.