我打算设计一个数据仓库,听说过“物化视图”。事实上,我想创建一个视图,并且希望在基础表发生更改时它可以自动更新。有人能用查询示例来解释一下吗?
我打算设计一个数据仓库,听说过“物化视图”。事实上,我想创建一个视图,并且希望在基础表发生更改时它可以自动更新。有人能用查询示例来解释一下吗?
在SQL Server中,它们被称为索引视图 - 阅读以下白皮书以了解更多背景知识:
基本上,您需要做的就是:
然后你就完成了!
关键部分是:视图必须满足相当多的约束和限制 - 这些在白皮书中有概述。如果您这样做了,那么这就是全部内容。视图将自动更新,无需维护。
其他资源:
虽然就工程角度而言,索引视图听起来像是每个人都可以用来提高性能的东西,但实际情况却非常不同。由于有太多可以被索引和不可以被索引的限制,我在最需要使用索引视图的地方一直没有成功。
如果视图中有外连接,则无法使用索引视图。此外,通用表达式也不允许...事实上,如果子查询或派生表中有任何排序(例如使用partition by子句),那么你将毫无办法。
这只留下了非常简单的场景可以利用索引视图,但我认为,通过在底层表上创建适当的索引,可以进行优化。
如果有人可以分享实际应用索引视图的经验,并且在没有它们的情况下无法完成任务,那我会非常高兴听到。
(NOEXPAND)
提示。您会注意到区别。使用索引视图的优势是限制记录选择,而不是“正确地为表建立索引”。否则,就会与您所说的一样。 - ajeh您可能需要更多了解什么是Materialized View。在Oracle中,这是一个由多个元素组成的对象,当您尝试在其他地方构建它时。
MVIEW本质上是来自另一个源的数据快照。与视图不同,查询视图时不会找到数据,而是以表格形式存储在本地。MVIEW使用后台过程定期刷新或在源数据更改时启动。Oracle允许全面或部分刷新。
在SQL Server中,我将使用以下内容创建基本的MVIEW以定期(完整)刷新。
首先是视图。对于大多数人来说,这应该很容易,因为视图在任何数据库中都很常见。
接下来是表格。这应该与视图在列和数据方面相同。这将存储视图数据的快照。
然后是一个过程,它截断表格并基于视图中的当前数据重新加载它。
最后,是触发该过程开始工作的作业。
其他所有内容都是实验。
当索引视图不可用且快速更新不是必需时,您可以创建一个 hack cache 表:
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
NB: 这会占用空间,也会在日志中记录下来。最好用于计算缓慢的小型数据集。可能需要重新设计,在外部视图中先消除“简单但大型”的列。