Answers:
它们在SQL Server中称为索引视图 -阅读这些白皮书以了解更多背景信息:
基本上,您需要做的是:
完成了!
棘手的部分是:视图必须满足许多约束和限制-白皮书中概述了这些约束和限制。如果您这样做-这就是全部。该视图将自动更新,无需维护。
其他资源:
虽然纯粹从工程角度来看,索引视图听起来像是每个人都可以用来提高性能的东西,但现实生活中的情况却大不相同。我一直无法在最需要它们的地方使用索引视图,因为对可以索引和不能索引的内容有太多限制。
如果视图中有外部联接,则无法使用它们。另外,不允许使用公用表表达式...实际上,如果您在子选择表或派生表中有任何顺序(例如,使用partition by子句),那么您也很不走运。
这仅使非常简单的场景可以利用索引视图,我认为可以通过在基础表上始终创建适当的索引来优化某些内容。
我会很高兴听到一些现实生活中的场景,在这些场景中,人们实际上已经使用索引视图来受益,而没有索引视图就无法做到
(NOEXPAND)
使用索引视图的查询添加提示。然后您会注意到差异。使用索引视图与“正确索引表”相比,其优势在于限制了记录的选择,否则您是正确的,它是相同的。
您可能需要更多有关物化视图实际内容的背景。在Oracle中,当您尝试在其他位置构建对象时,这些对象由许多元素组成。
MVIEW本质上是另一个来源的数据快照。与视图不同,在查询视图时找不到数据,该数据以表格形式存储在本地。MVIEW使用后台程序刷新,该程序定期启动或在源数据更改时启动。Oracle允许全部或部分刷新。
在SQL Server中,我将使用以下内容创建一个基本的MVIEW以定期(完整)刷新。
首先,一个视图。对于大多数人来说,这应该很容易,因为视图在任何数据库中都很常见。这应该与列和数据中的视图相同。这将存储视图数据的快照。然后,一个过程将截断该表,并根据视图中的当前数据重新加载该表。最后,一个触发程序开始工作的工作。
其他一切都是实验。
如果没有索引视图选项,并且不需要快速更新,则可以创建一个hack缓存表:
select * into cachetablename from myviewname
alter table cachetablename add primary key (columns)
-- OR alter table cachetablename add rid bigint identity primary key
create index...
然后使用sp_rename视图/表或更改引用它的任何查询或其他视图以指向高速缓存表。
安排每天/每晚/每周/什么都不会刷新
begin transaction
truncate table cachetablename
insert into cachetablename select * from viewname
commit transaction
注意:这会占用您的TX日志中的空间。最适用于计算速度较慢的小型数据集。也许重构是为了消除“容易但很大”的列,而这首先要进入外部视图。
对于MS T-SQL Server,建议您考虑使用“ include”语句创建索引。不需要唯一性,与聚簇索引关联的数据的物理排序也不需要。“索引...包含()”创建由系统自动维护的单独的物理数据存储。从概念上讲,它与Oracle物化视图非常相似。
https://msdn.microsoft.com/zh-CN/library/ms190806.aspx
https://technet.microsoft.com/zh-CN/library/ms189607(v=sql.105).aspx