本文共 4191 字,大约阅读时间需要 13 分钟。
视图也称为虚拟表,因为视图所返回的结果集的一般格式与表相同,都是由列和行组成,而且在 SQL 语句中引用视图的方式也与引用表的方式相同。标准视图的结果集不是永久地存储在数据库中。每次查询引用标准视图时,SQL Server 都会在内部将视图的定义替换为该查询,直到修改后的查询仅引用基表。然后,它将照常运行所得到的查询。有关详细信息,请参阅。
对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图。如果在查询中频繁地引用这类视图,可通过对视图创建唯一聚集索引来提高性能。对视图创建唯一聚集索引后,结果集将存储在数据库中,就像带有聚集索引的表一样。
对视图创建索引的另一个好处是:优化器可以在未直接在 FROM 子句中指定某一视图的查询中使用该视图的索引。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。有关详细信息,请参阅。
对基表中的数据进行更改时,数据更改将反映在索引视图中存储的数据中。视图的聚集索引必须唯一,这一要求提高了 SQL Server 在索引中查找受任何数据更改影响的行的效率。
和早期版本相此,当查询和视图定义中都包含下列匹配元素时,查询优化器在处理查询时能更充分地发挥索引视图的作用:
SELECT ColA, ColB FROM TableT WHERE ColC * (ColD + 10) > 50
CREATE VIEW V1 WITH SCHEMABINDING ASSELECT ColA, ColB, ColC * (ColD + 10) AS ExpColFROM dbo.TableT
SELECT COUNT_BIG (*) FROM dbo.TableT
CREATE VIEW V2 WITH SCHEMABINDING ASSELECT COUNT_BIG (*) AS Cnt FROM dbo.TableT
当查询优化器选择查询计划时,它还会考虑下列因素:
CREATE VIEW V1 WITH SCHEMABINDING ASSELECT ColA, ColB, ColC FROM dbo.TableTWHERE ColA > 1 and ColA < 10
SELECT ColB, ColC FROM dbo.TableTWHERE ColA > 3 and ColA < 7
V1
匹配,因为查询中定义的 3
到 7
的间隔位于索引视图中定义的 1
到 10
的间隔内。SELECT ColA, ColB from dbo.TableTWHERE ColA < ColB
CREATE VIEW V1 WITH SCHEMABINDING ASSELECT ColA, ColB FROM dbo.TableTWHERE ColB > ColA
请记住,因为这对所有索引都适用,所以只有当查询优化器确定使用索引视图会有所帮助时,SQL Server 才会选择在其查询计划中使用索引视图。
索引视图可以在 SQL Server 2008 的任何版本中创建。在 SQL Server 2008 Enterprise 中,查询优化器会自动考虑索引视图。若要在其他所有版本中使用索引视图,则必须使用 NOEXPAND 表提示。
如果很少更新基础数据,则索引视图的效果最佳。维护索引视图的成本可能高于维护表索引的成本。如果经常更新基础数据,则维护索引视图数据的成本可能超过使用索引视图所带来的性能收益。如果基础数据以批处理的形式定期更新,但在更新之间主要作为只读数据进行处理,请考虑在更新前删除所有索引视图,然后再重新生成。这样做可以提高更新的性能。
索引视图可以提高下列查询类型的性能:
CREATE TABLE wide_tbl(a int PRIMARY KEY, b int, ..., z int)CREATE VIEW v_abc WITH SCHEMABINDING ASSELECT a, b, cFROM dbo.wide_tblWHERE a BETWEEN 0 AND 1000CREATE UNIQUE CLUSTERED INDEX i_abc ON v_abc(a)
v_abc
即可应答以下查询: SELECT b, count_big(*), SUM(c)FROM wide_tbl WHERE a BETWEEN 0 AND 1000GROUP BY b
v_abc
比表 wide_tbl
占的页少。因此,优化器选择通过它来解决上述查询可能会更好。如果要垂直拆分整个表,而不是表的一个子集,建议您使用表的非聚集索引,该索引使用 INCLUDE 子句只包含所需的列,而不是索引视图。有关详细信息,请参阅 。索引视图通常不会提高下列查询类型的性能:
SELECT PriKey, SUM(SalesCol)FROM ExampleTableGROUP BY PriKey
ExampleTable
基表的行数相等,那么查询使用此索引视图不会比直接读取基表获得更高的性能。虽然对可索引的视图类型的限制可能使您无法设计完全解决某个问题的视图,但仍可以设计多个较小的索引视图,从一定程度上加快进程的速度。
请考虑下列示例:
设计可以满足多个操作的索引视图。因为即使未在 FROM 子句中指定,优化器也可以使用索引视图,所以,设计良好的索引视图可以加快许多查询的处理速度。
例如,请考虑对以下视图创建索引:
CREATE VIEW ExampleView WITH SCHEMABINDINGASSELECT GroupKey, SUM(Colx) AS SumColx, COUNT_BIG(Colx) AS CountColxFROM MyTableGROUP BY GroupKey
此视图不仅能满足直接引用视图列的查询,还可用于满足查询基表并包含 SUM(Colx)
、COUNT_BIG(Colx)
、COUNT(Colx)
和 AVG(Colx)
等表达式的查询。因为所有这些查询只须在视图中检索少量的行,而不需要从基表中读取全部行,所以查询速度将更快。
同样,聚合数据并按天分组的索引视图可用于满足聚合 1 天以上(如 7、30 或 90 天)的几个不同范围的查询。
转载地址:http://irfmi.baihongyu.com/