什么时候以及为什么有些人决定他们需要在他们的数据库中创建一个视图?为什么不运行一个普通的存储过程或选择?


当前回答

视图相对于存储过程的一个主要优点是,您可以像使用表一样使用视图。也就是说,可以在查询的FROM子句中直接引用视图。例如,SELECT * FROM dbo.name_of_view。

在几乎所有其他方面,存储过程都更强大。你可以传入参数,包括输出参数,让你一次有效地返回几个值,你可以做SELECT, INSERT, UPDATE和DELETE操作,等等。

如果你想要一个View能够从from子句中进行查询,但你也想要能够传入参数,也有一种方法可以做到这一点。它叫做表值函数。

这里有一篇关于这个主题的非常有用的文章:

http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html

编辑:顺便说一下,这就提出了一个问题,视图比表值函数有什么优势?对此,我没有一个很好的答案,但我要指出,创建视图的T-SQL语法比创建表值函数要简单,数据库用户可能更熟悉视图。

其他回答

这并没有确切地回答你的问题,但我认为值得一提的是物化视图。我的经验主要是使用Oracle,但是SQL-Server应该是相当相似的。

We used something similar in our architecture to address XML performance problems. Our systems are designed with a lot of data stored as XML on a row and applications might need to query particular values within it. Handling lots of XMLTypes and running XPaths across large number of rows has a large impact on performance so we use a form of materialized views to extract the desired XML nodes out into a relational table anytime the base table changes. This effectively provides a physical snapshot of the query at a point in time as opposed to standard views which would run their query on demand.

关注特定的数据 视图允许用户专注于他们感兴趣的特定数据和他们负责的特定任务。不必要的数据可以从视图中删除。这还提高了数据的安全性,因为用户只能看到视图中定义的数据,而不能看到底层表中的数据。有关将视图用于安全目的的更多信息,请参见将视图用作安全机制。

To Simplify Data Manipulation Views can simplify how users manipulate data. You can define frequently used joins, projections, UNION queries, and SELECT queries as views so that users do not have to specify all the conditions and qualifications each time an additional operation is performed on that data. For example, a complex query that is used for reporting purposes and performs subqueries, outer joins, and aggregation to retrieve data from a group of tables can be created as a view. The view simplifies access to the data because the underlying query does not have to be written or submitted each time the report is generated; the view is queried instead. For more information about manipulating data.

还可以创建逻辑上作为参数化视图操作的内联用户定义函数,或者在where子句搜索条件中具有参数的视图。有关更多信息,请参见内联用户定义函数。

自定义数据 视图允许不同的用户以不同的方式查看数据,即使他们同时使用相同的数据。当具有许多不同兴趣和技能水平的用户共享同一个数据库时,这是特别有利的。例如,可以创建一个视图,该视图仅检索与客户经理打交道的客户的数据。该视图可以根据使用该视图的帐户经理的登录ID确定检索哪些数据。

To Export and Import Data Views can be used to export data to other applications. For example, you may want to use the stores and sales tables in the pubs database to analyze sales data using Microsoft® Excel. To do this, you can create a view based on the stores and sales tables. You can then use the bcp utility to export the data defined by the view. Data can also be imported into certain views from data files using the bcp utility or BULK INSERT statement providing that rows can be inserted into the view using the INSERT statement. For more information about the restrictions for copying data into views, see INSERT. For more information about using the bcp utility and BULK INSERT statement to copy data to and from a view, see Copying To or From a View.

To Combine Partitioned Data The Transact-SQL UNION set operator can be used within a view to combine the results of two or more queries from separate tables into a single result set. This appears to the user as a single table called a partitioned view. For example, if one table contains sales data for Washington, and another table contains sales data for California, a view could be created from the UNION of those tables. The view represents the sales data for both regions. To use partitioned views, you create several identical tables, specifying a constraint to determine the range of data that can be added to each table. The view is then created using these base tables. When the view is queried, SQL Server automatically determines which tables are affected by the query and references only those tables. For example, if a query specifies that only sales data for the state of Washington is required, SQL Server reads only the table containing the Washington sales data; no other tables are accessed.

Partitioned views can be based on data from multiple heterogeneous sources, such as remote servers, not just tables in the same database. For example, to combine data from different remote servers each of which stores data for a different region of your organization, you can create distributed queries that retrieve data from each data source, and then create a view based on those distributed queries. Any queries read only data from the tables on the remote servers that contains the data requested by the query; the other servers referenced by the distributed queries in the view are not accessed.

When you partition data across multiple tables or multiple servers, queries accessing only a fraction of the data can run faster because there is less data to scan. If the tables are located on different servers, or on a computer with multiple processors, each table involved in the query can also be scanned in parallel, thereby improving query performance. Additionally, maintenance tasks, such as rebuilding indexes or backing up a table, can execute more quickly. By using a partitioned view, the data still appears as a single table and can be queried as such without having to reference the correct underlying table manually.

如果满足以下条件之一,分区视图是可更新的: 在视图上定义了一个INSTEAD OF触发器,其逻辑支持INSERT、UPDATE和DELETE语句。

视图和INSERT、UPDATE和DELETE语句都遵循为可更新分区视图定义的规则。有关更多信息,请参见创建分区视图。

https://technet.microsoft.com/en-us/library/aa214282 (v = sql.80) . aspx # sql:加入

它可以作为ORM和表之间的“中间人”。

例子:

我们有一个Person表,我们需要改变它的结构,以便将SomeColumn列移动到另一个表,并与之有一对多的关系。

然而,系统的大多数情况下,就Person而言,仍然将SomeColumn作为一个单独的东西使用,而不是很多东西。我们使用一个视图将所有的SomeColumns聚集在一起,并将其放在视图中,效果很好。

这是可行的,因为数据层发生了变化,但业务需求没有根本变化,因此业务对象不需要更改。如果业务对象必须改变,我不认为这是一个可行的解决方案,但视图绝对是一个很好的中间点。

视图相对于存储过程的一个主要优点是,您可以像使用表一样使用视图。也就是说,可以在查询的FROM子句中直接引用视图。例如,SELECT * FROM dbo.name_of_view。

在几乎所有其他方面,存储过程都更强大。你可以传入参数,包括输出参数,让你一次有效地返回几个值,你可以做SELECT, INSERT, UPDATE和DELETE操作,等等。

如果你想要一个View能够从from子句中进行查询,但你也想要能够传入参数,也有一种方法可以做到这一点。它叫做表值函数。

这里有一篇关于这个主题的非常有用的文章:

http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html

编辑:顺便说一下,这就提出了一个问题,视图比表值函数有什么优势?对此,我没有一个很好的答案,但我要指出,创建视图的T-SQL语法比创建表值函数要简单,数据库用户可能更熟悉视图。

关于视图的一件奇怪的事情是,它们被Microsoft Access视为表:当您使用ODBC将Microsoft Access前端附加到SQL数据库时,您将在可用表列表中看到表和视图。因此,如果你在MS Access中准备复杂的报告,你可以让SQL服务器来做连接和查询,这大大简化了你的工作。在Excel中准备查询也是如此。