索引(物化)视图

视图的基础知识

什么是视图?

视图也称为虚拟表,标准视图的结果集不是永久地存储在数据库中。每次查询引用标准视图时,SQL Server 都会在内部将视图的定义替换为该查询,直到修改后的查询仅引用基表。然后,它将照常运行所得到的查询。

注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。不能对视图进行增、删、改操作

分类

逻辑(标准)视图、索引(物化)视图。

 

逻辑视图和索引视图

逻辑视图就是我们平常见到的视图,视图的数据不独立存储,而是通过视图的定义取原表的数据。

索引视图,即物化视图,顾名思义,是物化的,有实际存储的,可以建立索引的。索引视图对视图的定义有很严格的要求。

为什么要用索引视图

对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图。如果在查询中频繁地引用这类视图,可通过对视图创建唯一聚集索引来提高性能。对视图创建唯一聚集索引后,结果集将存储在数据库中,就像带有聚集索引的表一样。

索引视图的建立

要点

1.必须要加上WITH SCHEMABINDING, 就是绑定到架构.

2.创建完视图后必须紧跟着创建一个CLUSTERED聚集唯一索引.

3.只支持两部分命名的表或UDF,  dbo.SalesOrder. 

4.涉及到多个表连接时不支持left join right join的写法只能用from...where的方式或inner join的方式连接. (这一点有时很要命如果join多个表而这些表又不能都用inner join的方式时.)

5.不支持table.*这种懒省事的方式得一个一个把想要的列写清楚.

实例

--设定会话设置

SET ANSI_NULLS ON

GO

SET ANSI_PADDING ON

GO

SET ANSI_WARNINGS ON

GO

SET CONCAT_NULL_YIELDS_NULL ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET NUMERIC_ROUNDABORT OFF

GO

 

--创建视图(很多限制)

create VIEW vUserInfo

with SCHEMABINDING--绑定结构

AS

SELECT dbo.[User].ID,dbo.[User].AddTime,dbo.op.Name,dbo.op.Pwd 

FROM dbo.[User] 

INNER JOIN dbo.OP ON dbo.[User].ID=dbo.OP.ID

--创建聚集索引

CREATE UNIQUE CLUSTERED INDEX PK_vUserInfo ON vUserInfo(ID)

--视图占用多少空间

EXECUTE sp_spaceused 'vUserInfo'


 

 

 

https://msdn.microsoft.com/zh-cn/library/ms187864