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

有帮助吗?

解决方案

他们叫 索引视图 在SQL Server中 - 阅读以下更多背景的这些白皮书:

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

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

你完成了!

棘手的部分是:视图必须满足许多约束和局限性 - 白皮书中概述了这些限制和局限性。如果您这样做 - 仅此而已。该视图正在自动更新,不需要维护。

其他资源:

其他提示

尽管纯粹是从工程学的角度来看,索引的视图听起来像是每个人都可以用来提高性能的东西,但是现实生活中的情况却大不相同。我一直没有成功使用索引视图,因为我最需要它们,因为对索引和不能索引的内容有太多限制。

如果您的视图中外部连接,则无法使用它们。另外,不允许使用常见的表表达式...实际上,如果您在子选项或派生表中有任何订购(例如按子句分区),那么您也不运气。

这只会留下非常简单的方案要利用索引视图,我认为可以通过在基础表上创建适当的索引来优化某些情况。

我很高兴能听到一些现实生活中的情况,人们实际上已经使用了索引观点来利益,没有他们就无法做到

您可能需要更多的背景,以了解实际的视图的实际含义。在Oracle中,这些对象由您在其他地方构建时由许多元素组成。

Mview本质上是来自另一个来源的数据快照。与视图不同,当您查询视图时,找不到数据以本地存储在表格中。使用定期间隔或源数据更改时启动的背景过程对Mview进行刷新。 Oracle允许全面或部分刷新。

在SQL Server中,我将使用以下内容来创建(完整)定期刷新的基本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

NB:这将在您的TX日志中吃空间。最适合计算缓慢的小数据集。可能首先将“简单但大”的柱子消除到外视图中。

对于MS T-SQL Server,我建议您使用“ Include”语句创建索引。不需要唯一性,与群集索引相关的数据的物理分类也不是。 “索引... include()”创建一个由系统自动维护的单独的物理数据存储。从概念上讲,它与甲骨文实现的视图非常相似。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top