如何在 SQLServer 中创建物化视图?

我将要设计一个数据仓库,我听说过物化视图。实际上,我想创建一个视图,它应该在基表更改时自动更新。有人能用一个查询示例来解释吗?

279340 次浏览

它们在 SQL Server 中被称为 索引视图——阅读这些白皮书了解更多背景知识:

Basically, all you need to do is:

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

你就完了!

棘手的部分是: 视图必须满足相当多的约束和限制-这些都在白皮书中概述。如果你这么做,就只有这些了。视图正在自动更新,不需要维护。

额外资源:

虽然纯粹从工程的角度来看,索引视图听起来像是每个人都可以用来改进性能的东西,但是实际情况却大不相同。我一直不成功是使用索引视图,我最需要他们,因为太多的限制,什么可以索引和什么不能。

如果视图中有外部联接,则不能使用它们。另外,不允许使用常见的表表达式... ... 事实上,如果在子选择或派生表中有任何排序(例如使用逐个子句分区) ,那么您也很不幸。

That leaves only very simple scenarios to be utilizing indexed views, something in my opinion can be optimized by creating proper indexes on underlying tables anyway.

我会很高兴听到一些现实生活中的场景,其中人们实际上使用索引视图为他们的利益,不能没有他们

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

MVIEW 本质上是来自另一个源的数据的快照。与视图不同,当查询以表格形式本地存储的视图时,无法找到数据。使用后台过程刷新 MVIEW,该后台过程定期启动或当源数据更改时启动。Oracle 允许完全刷新或部分刷新。

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

首先,视图。这对大多数人来说应该很容易,因为视图在任何数据库中都很常见

下一张桌子。这应该与列和数据中的视图相同。这将存储视图数据的快照。

然后,一个过程截断表,并根据视图中的当前数据重新加载它。

最后,触发过程启动其工作的作业。

其他的都是实验。

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

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 日志中。最适用于计算速度慢的小型数据集。也许可以重构,首先将“简单但大”的列删除到外部视图中。

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

Https://learn.microsoft.com/en-us/sql/relational-databases/indexes/create-indexes-with-included-columns