最近项目中发现一个问题,就是按Not in top方法对视图 分页时候如果不指定order by 条件,分页出来的每页结果存在混乱现象,究其原因还是因为视图本身没有类似表一样的默认排序规则,导致数据分页无序读取的,看来还是
对视图不是很了解,特查了下SQL server的帮助,摘要如下:
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图在数据库中并不是以数据值存储集形式存在,除非是索引视图。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。分布式查询也可用于定义使用多个异类源数据的视图。例如,如果有多台不同的服务器分别存储您的单位在不同地区的数据,而您需要将这些服务器上结构相似的数据组合起来,这种方式就很有用。
通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
标准视图
标准视图组合了一个或多个表中的数据,您可以获得使用视图的大多数好处,包括将重点放在特定数据上及简化数据操作。有关这些好处的详细信息,请参阅使用视图的情况。
索引视图
索引视图是被具体化了的视图,即它已经过计算并存储。可以为视图创建索引,即对视图创建一个唯一的聚集索引。索引视图可以显著提高某些类型查询的性能。索引视图尤其适于聚合许多行的查询。但它们不太适于经常更新的基本数据集。有关详细信息,请参阅设计索引视图。
分区视图
分区视图在一台或多台服务器间水平连接一组成员表中的分区数据。这样,数据看上去如同来自于一个表。联接同一个 SQL Server 实例中的成员表的视图是一个本地分区视图。
注意: |
---|
SQL Server 2005 中包含本地分区视图只是为了实现向后兼容,并且当前不推荐使用。本地分区数据的首选方法是通过已分区表。有关详细信息,请参阅已分区表和已分区索引。 |
如果视图在服务器间联接表中的数据,则它是分布式分区视图。分布式分区视图用于实现数据库服务器联合。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负
视图通常用来集中、简化和自定义每个用户对数据库的不同认识。视图可用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问视图基础表的权限。视图可用于提供向后兼容接口来模拟曾经存在但其架构已更改的表。还可以在向 Microsoft SQL Server 2005 复制数据和从其中复制数据时使用视图,以便提高性能并对数据进行分区。
着重于特定数据
视图使用户能够着重于他们所感兴趣的特定数据和所负责的特定任务。不必要的数据或敏感数据可以不出现在视图中。
例如,AdventureWorks 示例数据库中的视图 vBikes
允许用户查看当前库存的所有自行车的名称。该视图将从 Product
表中筛选掉除 Name
之外的所有字段,并仅返回自行车成品的名称,而不是自行车配件的名称。
复制代码 | |
---|---|
Create VIEW vBikes AS Select DISTINCT p.[Name] FROM Production.Product p JOIN Production.ProductInventory i ON p.ProductID = i.ProductID JOIN Production.ProductSubCategory ps ON p.ProductSubcategoryID = ps.ProductSubCategoryID JOIN Production.ProductCategory pc ON (ps.ProductCategoryID = pc.ProductCategoryID AND pc.Name = N'Bikes') AND i.Quantity > 0 |
简化数据操作
视图可以简化用户处理数据的方式。可以将常用联接、投影、UNION 查询和 Select 查询定义为视图,以便使用户不必在每次对该数据执行附加操作时指定所有条件和条件限定。例如,可以将一个用于报表目的且执行子查询、外联接和聚合来从一组表中检索数据的复杂查询创建为视图。视图简化了对数据的访问,因为每次生成报表时无需编写或提交基础查询,而是查询视图。有关对数据进行操作的详细信息,请参阅查询基础知识。
尽管不是复杂查询,AdventureWorks 示例数据库中的视图 vBikes 仍允许用户着重于特定数据,而不必构造生成视图所需的 JOIN 子句。
还可以创建用户定义的内联函数,在逻辑上作为参数化视图运行,或者作为在 Where 子句搜索条件或查询的其他部分中含有参数的视图运行。有关详细信息,请参阅内联用户定义函数。
提供向后兼容性
视图使您能够在表的架构更改时为表创建向后兼容接口。例如,一个应用程序可能引用了具有以下架构的非规范化表:
Employee(Name, BirthDate, Salary, Department, BuildingName)
若要避免在数据库中重复存储数据,可以通过将该表拆分为下列两个表来规范化该表:
Employee2(Name, BirthDate, Salary, DeptId)
Department(DeptId, BuildingName)
若要提供仍然引用 Employee 中的数据的向后兼容接口,可以删除原有的 Employee 表并用以下视图替换:
复制代码 | |
---|---|
Create VIEW Employee AS Select Name, BirthDate, Salary, BuildingName FROM Employee2 e, Department d Where e.DeptId = d.DeptId |
此时,用于查询 Employee 表的应用程序可以从 Employee 视图中获取它们的数据。如果只从 Employee 中读取,则不必更改应用程序。通过向新视图添加 INSTEAD OF 触发器,将对视图的 Insert、Delete 和 Update 操作映射到基础表,有时也可以支持更新 Employee 的应用程序。有关详细信息,请参阅设计 INSTEAD OF 触发器。
自定义数据
视图允许用户以不同方式查看数据,即使在他们同时使用相同的数据时也是如此。这在具有许多不同目的和技术水平的用户共用同一数据库时尤其有用。例如,可创建一个视图以仅检索由客户经理处理的客户数据。该视图可以根据使用它的客户经理的登录 ID 决定检索哪些数据。
导出和导入数据
可使用视图将数据导出到其他应用程序。例如,您可能希望使用 AdventureWorks 数据库中的 Customer 和 SalesOrderHeader 表在 Microsoft Excel 中分析销售数据。为此,可基于 Customer 和 SalesOrderHeader 表创建视图。然后,使用 bcp 实用工具导出由该视图定义的数据。如果可以使用 Insert 语句向视图中插入行,则还可以使用 bcp 实用工具或 BULK Insert 语句将数据从数据文件导入某些视图。有关向视图中复制数据的限制的详细信息,请参阅
跨服务器组合分区数据
Transact-SQL UNION 集合运算符可在视图内使用,将单独表的两个或多个查询的结果组合到单一的结果集中。这在用户看来是一个单独的表,称为分区视图。例如,如果一个表包含华盛顿的销售数据,另一个表包含加利福尼亚的销售数据,则可以对这两个表使用 UNION 创建一个视图。该视图代表这两个地区的销售数据。
使用分区视图时,请您首先创建几个相同的表,指定一个约束以确定可在各个表中添加的数据范围。然后,使用这些基表创建视图。查询视图时,SQL Server 将自动确定查询所影响的表并仅引用这些表。例如,如果一个查询指定只需要华盛顿州的销售数据,SQL Server 将只读取包含华盛顿销售数据的表,而不访问其他表。
分区试图可基于来自多个异类源(如远程服务器)的数据以创建数据库服务器的联合体。例如,若要将分别存储组织中不同区域数据的几台远程服务器上的数据组合起来,可以创建分布式查询,从每个数据源中检索数据,然后基于这些分布式查询创建视图。所有查询都只读取包含查询所请求数据的远程服务器上的表中的数据,而不访问由视图中的分布式查询所引用的其他服务器。
跨多个服务器对数据进行分区时,只访问一部分数据的查询可以较快地运行,因为只需扫描较少的数据。如果表位于不同服务器上,或者位于一台使用多个处理器的计算机上,则还可以并行扫描该查询所涉及的每个表。这可以提高查询性能。此外,维护任务(例如重新生成索引或备份表)可更快地执行。
通过使用分区视图,数据的外观象是一个单一表,并且能以单一表的方式进行查询,而无需手动引用正确的基础表。
注意: |
---|
本地分区视图或组合同一个服务器上表中的分区数据的视图包含在 Microsoft SQL Server 2005 中,只是为了提供向后兼容性。本地分区数据的首选方法是通过已分区表。有关详细信息,请参阅已分区表和已分区索引。 |
如果满足下列任一条件,则分区视图可被更新:
- 具有逻辑的视图定义支持 Insert、Update 和 Delete 语句的 INSTEAD OF 触发器。