我打算设计一个数据仓库,我听说了物化视图。实际上我想创建一个视图,它应该在基表更改时自动更新。任何人都可以用查询示例来解释吗?
5 回答
它们在 SQL Server 中被称为索引视图- 阅读这些白皮书了解更多背景信息:
基本上,您需要做的就是:
- 创建常规视图
- 在该视图上创建聚集索引
你就完成了!
棘手的部分是:视图必须满足相当多的约束和限制——白皮书中概述了这些。如果你这样做,那就是全部。视图会自动更新,无需维护。
其他资源:
虽然纯粹从工程的角度来看,索引视图听起来像是每个人都可以用来提高性能的东西,但实际情况却大不相同。我在最需要它们的地方使用索引视图是不成功的,因为对可以索引的内容和不能索引的内容有太多限制。
如果视图中有外部联接,则不能使用它们。此外,不允许使用公用表表达式......事实上,如果您在子选择或派生表中有任何排序(例如使用 partition by 子句),那么您也很不走运。
这只留下非常简单的场景来使用索引视图,在我看来,无论如何都可以通过在基础表上创建适当的索引来优化某些东西。
我会很高兴听到一些现实生活场景,其中人们实际上使用索引视图来谋取利益,没有它们就无法做到
您可能需要更多关于物化视图实际上是什么的背景知识。在 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”语句创建索引。唯一性不是必需的,与聚集索引相关的数据的物理排序也不是必需的。“Index...Include()”创建了一个由系统自动维护的单独的物理数据存储。它在概念上与 Oracle 物化视图非常相似。
https://msdn.microsoft.com/en-us/library/ms190806.aspx
https://technet.microsoft.com/en-us/library/ms189607(v=sql.105).aspx