索引(物化)视图
视图的基础知识
什么是视图?
视图也称为虚拟表,标准视图的结果集不是永久地存储在数据库中。每次查询引用标准视图时,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
转载于:https://blog.51cto.com/sukunwu/1671525