问题标签 [indexed-views]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - SQL Server 中使用索引视图的基本事件溯源
我正在尝试使用 SQL Server 实现非常基本的事件溯源。没有库,没有其他服务器,没有什么花哨的,只是从使用 SQL Server 的基础开始。
假设我有这张桌子:
我现在想创建一个视图,显示按名称分组的最新数据,结果是:
够轻松,CREATE VIEW Latest AS SELECT t1.* FROM table t1 JOIN (SELECT TOP 1 Id FROM table ORDER BY CreatedOn DESC, Id DESC) t2 ON t2.Id = t1.Id;
现在我将在表中有数百万行,并且视图上有许多并发读取。所以我想索引它(SQL Server Indexed Views)。似乎我在这里不走运,因为索引视图不能包含派生表 OR TOP OR MAX OR 自联接。
关于如何创建索引视图的任何想法?
如果这不可能,我可以使用 INSTEAD OF 触发器,它更新表中的 IsLatest BIT 列,并基于此过滤器创建索引视图。
还有其他建议吗?
sql - 我可以创建一个包含一些子行摘要的 Sql Server 索引吗?
是否可以在 Sql Server 2016 中创建一些索引视图(或等效)来总结简单的父/子关系。
例如:
和这样的结果.. 例如:
我想如果我要把它写成一个 SQL 查询(我假设它没有被索引并且必须“计算”整个答案):
现在我在“索引”视图之后的原因是我假设计算存储在磁盘上,所以我只需扫描索引即可获得结果,而不必计算结果执行。
上面的例子也是悔恨的(对于这个问题)。实际上我有一个更大的表结构等等。
我明白索引视图不能有特定的关键字,比如COUNT
(如@brentozar 在博客文章中提到的那样)
我是否以错误的方式看待这个问题?我真的不想回复 SQL 缓存并更主动一点,在这里。
(注意:也许我一直在另一个 NoSql 数据库中进行许多 Map/Reduce 查询 :))
sql-server - 关闭索引视图中使用的时态表的系统版本控制
我有一个表,该表被许多要转换为临时表的索引视图使用。所有添加必要列和使用历史表设置 SYSTEM_VERSIONING=ON 的命令都成功了。但现在我不能用这个命令禁用系统版本控制
我得到错误
Cannot ALTER 'MyTable' because it is being referenced by object 'MyIndexedViewThatReferencesMyTable'.
删除所有视图,更改 MyTable,然后重新创建所有视图以完成此操作似乎不切实际。还有另一种方法可以让这张表恢复到非临时状态吗?
performance - 索引视图与临时表,以提高很少执行的查询的性能
我有一个缓慢的查询,其结构是
最后 3 次连接中的选择子查询相对简单,但再次连接需要时间。如果它们是物理表,那就更好了。
所以我发现我可以将子查询转换为索引视图或临时表。
我所说的临时表并不是指像这里解释的那样每小时写入的表,而是在查询执行之前创建的临时表。
现在我的怀疑来自这样一个事实,即索引视图在数据仓库中是可以的,因为它们会影响性能。该数据库不是数据仓库,而是非数据密集型应用程序的生产数据库。
但在我的情况下,即使更频繁地使用底层表(其数据将成为索引视图的一部分的表),上述查询也不会经常执行。
在这种情况下可以使用索引视图吗?或者我应该喜欢临时表?
primary key
带有关键字的表变量也是一种选择。
sql-server - 从 Oracle DB 在 SQL Server DB 上复制索引或物化视图
目标是以最简单/灵活的方式在生产 Oracle DB 中拥有多个表,在 SQL Server DB 上复制(用于报告目的)并尽可能接近实时。
目前,我正在做类似的事情:
只是,where
查询中有一个子句,ORA_DB
根据需要...破坏了 SQL Server 代理中的工作。
我的想法/希望是在 Oracle 中使用物化视图,但实际对象应该驻留在 SQL Server 上。认为这篇文章和其他一些偏好让我更愿意在 SQL Server 端拥有从 Oracle 提取的索引视图。
sql-server - varchar(120)上的聚集索引键长度警告?
所以今天我一直在做一些优化,创建一些索引视图等,我遇到了这个警告
警告!聚集索引的最大键长度为 900 字节。索引“IX_...”的最大长度为 8004 字节。对于较大值的某些组合,插入/更新操作将失败。
指数是
观点是
Id 是一个 INT
物理表中的 aField 是 VARCHAR(120)
那么索引的最大键长度不是 120+4 字节吗?
为什么我会看到这个警告?
它有效吗?
sql-server - 实时表替代与交换表
我使用 SSMS 2016。我有一个包含几百万条记录的视图。该视图没有被索引,也不应该被服务器上的作业每 5 分钟更新一次(插入、删除、更新),然后在 GUI 中向客户端调用应用程序显示更新数据集。
该视图将大量的 INT 值转换为 VARCHAR 并附加一些字符串值。
该视图还对 NULL 执行一些 CAST 操作,为它们分配列名别名。最严重的性能损失是视图在 20 列上使用 FOR XML PATH('') 函数。
此外,该视图使用两个 CTE 作为源以及 Subsidiaries 来定义单个列值。
我确保创建了视图 Select、JOIN 和 WHERE 子句中使用的正确索引(集群、非集群、复合和覆盖)。
Database Tuning Advisor 也没有提出任何可以显着提高性能的建议。
作为一种解决方法,我决定创建两个相同的物理表,每个表上都有聚簇索引,并使用 Merge 语句(进一步转换为 SP,然后转换为 SQL Server 代理作业)维护它们的更新。并确保视图不会长时间锁定。然后,我将在每次合并完成后立即交换(重命名)表名。因此,在这种情况下,所有繁重的工作负载都落在 SQL Server 代理作业上,以保持表的更新。
问题是考虑到当前数据的大小,合并将需要大约 15 分钟,这在未来可能会增加。因此,我需要进行实时设计以确保视图具有最新的信息。
有任何想法吗?
sql-server - SQL Server 索引视图分部
是否可以在索引视图的 SELECT 语句中执行除法?当我添加一列结果除以另一列的值时,我开始收到以下错误:
无法在视图“MyDB.dbo.getUsageForUsers”上创建聚集索引“CX_t”,因为视图的选择列表包含聚合函数或分组列的结果表达式。考虑从选择列表中删除聚合函数或分组列的结果表达式。
谢谢
stored-procedures - 由于关联的索引视图,基表上的更新/插入速度变慢
我们有一个基于某些条件更新表的存储过程。并且在同一个存储过程中,在某些其他条件下将 INSERTS 插入到同一个表中。现在这个目标表有一堆关联的索引视图,它们减慢了更新和删除的速度。我们现在要做的是在加载之前禁用视图上的索引并在加载之后重建它们。重建需要将近半个小时,但如果我们不禁用它,索引视图将重建一次以进行更新,一次重建以进行插入。
我的问题:
更新和插入,它们是重新创建每行的视图还是为 UPDATE/INSERT 中受影响的所有行重新创建视图
有没有办法批量插入和更新,以便索引视图在所有
INSERT
和所有UPDATE
索引视图访问表中正在更新/插入的列之一。现在,即使该特定列本身没有更改但表中的某些其他列已更新,是否会重新创建此索引视图。