如何在SQL Server中创建实体化视图?

时间:2010-10-21 10:14:21

标签: sql-server database-design indexed-views

我将设计一个DW,我听说了物化视图。实际上我想创建一个视图,它应该在更改基表时自动更新。任何人都可以用查询示例解释..

5 个答案:

答案 0 :(得分:119)

他们在SQL Server中被称为索引视图 - 阅读这些白皮书以获取更多背景信息:

基本上,您需要做的就是:

  • 创建常规视图
  • 在该视图上创建聚簇索引

你已经完成了!

棘手的部分是:视图必须满足许多约束和限制 - 白皮书中概述了这些限制和限制。如果你这样做 - 这就是全部。视图正在自动更新,无需维护。

其他资源:

答案 1 :(得分:36)

虽然纯粹从工程角度来看,索引视图听起来像每个人都可以用来提高性能,但现实生活场景却截然不同。我一直没有成功使用索引视图,因为对索引和可以索引的内容有太多限制,我最需要它们。

如果视图中有外连接,则无法使用它们。此外,不允许使用公用表表达式...事实上,如果您在子选择或派生表中有任何排序(例如使用partition by子句),那么您也不运气。

只留下非常简单的方案来利用索引视图,我认为可以通过在底层表上创建适当的索引来优化。

我会很高兴听到一些真人生活场景,人们实际上已经使用索引视图来获益,而没有它们就不可能完成

答案 2 :(得分:16)

您可能需要更多关于物化视图实际内容的背景知识。在Oracle中,当您尝试在其他地方构建它时,这些对象由许多元素组成。

MVIEW本质上是来自其他来源的数据的快照。与视图不同,查询视图时找不到数据,它以表格的形式存储在本地。使用后台程序刷新MVIEW,后台程序定期启动或源数据发生变化时启动。 Oracle允许完全或部分刷新。

在SQL Server中,我将使用以下内容创建一个基本的MVIEW来定期(完成)刷新。

首先,一个观点。这对大多数人来说应该很容易,因为在任何数据库中视图都很常见 接下来是一张桌子。这应该与列和数据中的视图相同。这将存储视图数据的快照。 然后,一个截断表的过程,并根据视图中的当前数据重新加载它。 最后,一个触发程序启动它的工作。

其他一切都是实验。

答案 3 :(得分:2)

当索引视图不是一个选项,并且不需要快速更新时,您可以创建一个黑客缓存表:

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日志。最适用于计算速度慢的小型数据集。也许重构可以消除"容易但很大的"列首先进入外部视图。

答案 4 :(得分:1)

对于MS T-SQL Server,我建议使用“include”语句创建索引。不需要唯一性,也不需要与聚簇索引关联的数据的物理排序。 “Index ... Include()”创建由系统自动维护的单独物理数据存储。它在概念上与Oracle物化视图非常相似。

https://msdn.microsoft.com/en-us/library/ms190806.aspx

https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx