使用视图可以创建由SELECT语句定义的表数据的虚拟表现。定义的SELECT语句能联结一个或者多个表,能包含一个或者多个列。一旦创建,视图能在查询的FROM子句中被引用。
视图能用来为查询编写者简化数据访问,隐蒧底层SELECT语句的复杂度。视图对管理安全和保护敏感数据同样有用。如果希望限制最终用户直接访问表,可以对视图授予执行权限,而不是对底层的表。还可以通过在视图定义中仅仅包含必要的列,暴露那些仪仪希望被最终用户看到的列。在某些情况下,视图甚至能允许直接的数据更新。视图也对后台数据提供了标准的接口,除非底层的表结构有重大改动,否则你不需要对它们作任何修改。
除了普通视图,还可以创建索引视图。这些视图在数据库中保存了真实的索引数据(普通视图实际不会去保存物理数据)廿还可以创建分布式分区视图,它可以让我们表示一个由分布在不同SQL Server实例中的水平分区表组成的逻辑表。SQL Server有3种视图。
SQL Server视图类型
视图类型 | 描 述 |
普通视图 | 这个视图由T-SQL含询定义。在数据库中不保存实际数据,只是视图定义 |
索引视图 | 这个视图一开始由T-SQL查询定义,然后在满足了一定条件后,就会创建聚集索引来物化和表数据相似的索引数据。一旦聚集索引创建后,就可以在需要时在索引视图上创建多个非聚集索引 |
分布式分区视图 | 出于性能或可扩展性(例如,扩展了每个SQL Server实例的袭大小)的需求,这种视图使用UNIOIN ALL来把多个跨两个以上SQL Server实例的较小的袭组合成一个虚拟表 |
视图是在把数据展现给最终用户之前预先筛选数据和列的好方法。视图能用于隐藏众多表联结和列的选取,也可以通过只对用户授权访问视图而不是实际的基础表来实现安全。
说了这么多视图的用途,我们仍然需要注意一些性能问题。如果考虑为你的数据库使用视图,考虑下面的最佳实践。
- 像SELECT查询一样对视图进行性能调优,因为普通视图从本质上说是一个“已存储的”查询。性能糟糕的视图会严重影响服务器性能。
- 不要嵌套视图超过一级。具体来说,不要定义一个调用另外一个视图的视图,等等。当你希望对性能低下的奋询进行调优时,这么做会引起混乱,并且会降低每个嵌套级别的性能。
- 如果可能的话,使用存储过程而不用视图。因为存储过程能重用执行计划,性能会有提升。存储过程也能减少网络流量,并可以实现更复杂的业务逻辑,而且比视图有更少的编码限制
创建视图后,它的定义就保存在数据库中,但是视图返回的真实数据不会从底层表分离出来。