A:分类:
视图分为标准SQL视图
动态视图
INFORMATION_SCHEMA视图
索引视图
分区视图
B:注意点:
一:视图的使用
使用一个新的执行计划比简单地重用一个视图的执行计划效果要好
原因:当使用查询中另外的表来引用一个SQLServer视图时SQL将会重新编译一切内容, 然后再创建一个新的最优的执行计划
二:视图的限制
一:一个视图最多可以包含1024列
二:视图嵌套最多达到32层
三:一个视图可以基于表和其他视图,但是不能基于临时表和表变量
四:视图中的SELECT语句不能带INTO子句(它不能以副作用的形式创建一个新表)
五:只有INSTEAD-OF触发器可以在视图上创建
六:视图中不可以使用COMPUTE 和 COMPUTE BY子句
七:Order by 子句只有和Top子句一其使用才能被用在视图中(创建视图时)
三:视图内容的修改
一:当更新视图时,若涉及多个基表列时 会引发“服务器: 消息 4405,级别 16,状态 2,因为修改会影响多个基表”的错误提示
详细内容:(摘录自SQL SERVER 2000帮助
如果视图没有 INSTEAD OF 触发器,或者视图不是分区视图,则视图只有满足下列条件才可更新:
select_statement 在选择列表中没有聚合函数,也不包含 TOP、GROUP BY、UNION(除非视图是本主题稍后要描述的分区视图)或
DISTINCT 子句。聚合函数可以用在 FROM 子句的子查询中,只要不修改函数返回的值。有关更多信息,请参见聚合函数。
select_statement 的选择列表中没有派生列。派生列是由任何非简单列表达式(使用函数、加法或减法运算符等)所构成的结果集列。
select_statement 中的 FROM 子句至少引用一个表。select_statement 必须不仅只包含非表格格式的表达式(即不是从表派生出的表达式)。
例如,以下视图是不可更新的:
CREATE VIEW NoTable AS
SELECT GETDATE() AS CurrentDate,
@@LANGUAGE AS CurrentLanguage,
CURRENT_USER AS CurrentUser
INSERT、UPDATE 和 DELETE 语句在可以引用可更新视图之前,也必须如上述条件指定的那样满足某些限制条件。只有当视图可更新,并
且所编写的 UPDATE 或 INSERT 语句只修改视图的 FROM 子句引用的一个基表中的数据时,UPDATE 和 INSERT 语句才能引用视图。只有 当视图在其 FROM 子句中只引用一个表时,DELETE 语句才能引用可更新的视图。
四:动态视图
和存储过程相比,视图的重要局限性--它们不支持参数。但是可以把一个自定义的表值函数当作支持参数的动态视图
五:INFORMATION_SCHEMA视图
SQL SERVER2000中用于获取原数据的系统视图
六:索引视图
当在视图上创建一个唯一聚集索引(unique clustered index)时 ,SQL Server将物化这个视图
所谓物化是指:记录保存在数据库中的方式和存储规则表上的聚集索引方式相同
创建索引视图的限制:
1.:该视图必须是使用WITH SCHEMABINDING选项来创建
2.:.........只引用基表,并且基本表和视图属于同一个所有者
3.:该视图只能连接一个数据库中的表
4.:......不能包含一个外部连接或自连接
5,:..............UNION,TOP,ORDER BY ,DISTINCT关键字
6.:如果指定了 GROUP BY,则视图选择列表必须包含 COUNT_BIG(*)
表达式,并且,视图定义不能指定 HAVING、CUBE 或 ROLLUP。
7. 执行 CREATE INDEX 语句的用户必须是视图的所有者。
当执行 CREATE INDEX 语句时,下列 SET 选项必须设置为 ON:
ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIERS
必须将选项 NUMERIC_ROUNDABORT 选项设置为 OFF。
视图不能包含 text、ntext 或 image 列,即使在 CREATE INDEX 语句中没有引用它们。
8. 如果视图定义中的 SELECT 语句指定了一个 GROUP BY 子句,则唯一聚集索引的键只能引用在 GROUP BY 子句中指定的列。
9.只有在SQL2000企业版本或开发版中才可创建索引视图
一:索引视图
当已经在视图上创建了聚集索引后,可以通过Create index来添加更多的非聚集索引
索引视图的优缺点:
优点:可以提高数据仓库和其他主要带有数据读取查询的系统的查询效率
缺点: 索引视图很可能会降低OLTP系统的性能。对索引视图的更新将会增加OLTP事务的开销
二:分区视图
你可曾想到过假如某电子商务网站后台数据库中存储大量的销售信息,这些销售信息自该网站从开始运营时就在不断的存储销售信息,而这些信息可能包含了多年的销售数据;然而很少需要处理多年的数据,绝大部分需求都是集中在处理几个月或当年当月的数据。如果这一切的数据都放在单个表中,那么数据的查询和管理的效率将会变得异常底下。
此时面对上述情况一个很好的解决方案如下: 将销售信息水平拆分(拆分可分为垂直和水平俩种)到几个分区表中,如:BOOKORDER2004,BOOKORDER2005,BOOKORDER2006。为了进行跨越所有表的分析(查询),你可以创建一个视图并把这些表放在一起:
--而将出自于一个表的多个实例的视图成为
Create view BookOrderView
As
Select * from BookOrder2004
Union all
Select * from BookOrder2005
Union all
Select * from BookOrder2006
Go
由上可见对于管理大型数据库是分区视图的必要性。而分区视图又可分为俩种类型
其一:本地分区视图(Local partitioned view), 即为分区视图中所有的基本表都是存储在单个服务器中的
其二:分布式分区视图(distributed partitioned view),顾名思义分布式分区视图中的基本表被存储在分离的多个服务器中,如有三个服务器分别名为:TOMMY,DLL,ZDY:
Create view BookOrderView
As
Select * from TOMMY.BookOrder2004
Union all
Select * from DLL.BookOrder2005
Union all
Select * from ZDY.BookOrder2006
Go