SQL 索引视图:如果数据发生变化会发生啥

Posted

技术标签:

【中文标题】SQL 索引视图:如果数据发生变化会发生啥【英文标题】:SQL Indexed Views : what happens if data has changedSQL 索引视图:如果数据发生变化会发生什么 【发布时间】:2010-01-07 20:11:30 【问题描述】:

我不明白索引视图是什么,但我想知道当底层表中的数据发生变化时究竟会发生什么? 整个视图缓存是否被丢弃或只是更改了行?

我对几个用于搜索酒店可用性(+100k 记录)的表(+5)进行了非常复杂的查询,恕我直言,索引视图可以显着提高性能。 但是数据(几行)经常更改(房间已售出,管理员 atc 中更改了免费房间),如果每次仅更改一行时都会重建视图,这将成为我的应用程序的瓶颈。

或者任何想法如何“缓存”非常复杂的查询?

谢谢。

【问题讨论】:

【参考方案1】:

来自技术网文档:

与普通索引不同,单行 插入任何参与的 表可能会导致多行更改 在索引视图中。这是因为 单行可以与多个连接 另一个表的行。同样是 true 更新和删除。 因此,维护一个 索引视图可能更昂贵 而不是维护一个索引 表。

来源:

http://technet.microsoft.com/en-us/library/cc917715.aspx#XSLTsection124121120120

即听起来好像在相关的地方更新了行,而不必更新/重新创建整个视图。

【讨论】:

我已经使用索引视图重写了我的 SP,性能令人震惊!。我希望重建索引视图时不会有大的额外维护。【参考方案2】:

我假设您正在运行 sql server。 100k+ 行并不是很多。如果您要加入 5ish 表,我建议您在考虑实施索引视图之前确保要加入的列上有覆盖索引。使用查询分析器直接查找查询中的瓶颈。如果您在这么小的表上遇到性能问题,则可能存在令人讨厌的表扫描。

【讨论】:

如果您在连接 5 个 100k 行的表时遇到性能问题,那么我怀疑查询中的某处存在问题,因此将其移动到索引视图只会使数据库服务器重新运行效率低下的查询更频繁。我建议查看原始查询的执行计划,特别注意表扫描,看看您是否可以重新设计和/或改进索引以使其运行得更快,然后再进一步处理索引视图。 嗨。检查表扫描的执行计划(和类似的慢任务)是我在调整 SQL 脚本时总是做的第一件事。查询有很多 UDF,在我将它们移动到索引视图后,它们并没有一直计算,而且性能很好。

以上是关于SQL 索引视图:如果数据发生变化会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

当实际数据发生变化时,结果缓存数据会发生啥变化?

如果您不向数据库(例如 SQL Server)提交事务,会发生啥情况?

如果未指定 Internet Explorer 兼容性视图会发生啥

如果我为我的表命名,为啥 SQL 查询顺序会发生变化? [关闭]

在 Oracle SQL 的主键上声明附加索引时会发生啥?

如果 SQL 查询花费更多时间并且 CONN_MAX_AGE 的剩余年龄更短,会发生啥情况?