如何在SQL Server中创建实体视图?
-
10-10-2019 - |
题
我要设计一个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