116

我打算设计一个数据仓库,我听说了物化视图。实际上我想创建一个视图,它应该在基表更改时自动更新。任何人都可以用查询示例来解释吗?

4

5 回答 5

159

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

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

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

你就完成了!

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

其他资源:

于 2010-10-21T10:39:32.557 回答
46

虽然纯粹从工程的角度来看,索引视图听起来像是每个人都可以用来提高性能的东西,但实际情况却大不相同。我在最需要它们的地方使用索引视图是不成功的,因为对可以索引的内容和不能索引的内容有太多限制。

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

这只留下非常简单的场景来使用索引视图,在我看来,无论如何都可以通过在基础表上创建适当的索引来优化某些东西。

我会很高兴听到一些现实生活场景,其中人们实际上使用索引视图来谋取利益,没有它们就无法做到

于 2013-06-16T19:41:07.687 回答
20

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

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

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

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

其他一切都是实验。

于 2014-04-24T18:45:04.663 回答
5

当索引视图不是一个选项,并且不需要快速更新时,您可以创建一个 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 日志中。最适用于计算缓慢的小型数据集。也许重构以首先将“简单但大”的列消除到外部视图中。

于 2016-05-22T16:43:59.267 回答
2

对于 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

于 2016-06-23T16:21:51.757 回答