Sql Server 视图是不是始终是最新的?

Posted

技术标签:

【中文标题】Sql Server 视图是不是始终是最新的?【英文标题】:Is a SqlServer View always up to date?Sql Server 视图是否始终是最新的? 【发布时间】:2009-12-04 12:17:01 【问题描述】:

sqlserver 视图是否总是最新的,还是会有延迟?

【问题讨论】:

【参考方案1】:

这取决于视图运行的transaction isolation 级别。默认情况下,视图在READ COMMITTED 运行。该视图将仅返回已提交的数据。只要您的视图只包含一条 SQL 语句,并且不调用用户定义的函数或扩展过程,就可以保持一致。

但视图也可以在风险更大的隔离级别上运行。例如,这个视图指定了nolock,所以它运行在READ UNCOMMITTED

create view dbo.MyView
as select * from dbo.MyTable with (nolock)

此视图可以返回属于将回滚(脏读)事务的一部分的值。此事务隔离级别以一致性换取性能。

【讨论】:

【参考方案2】:

非索引视图本质上不能存储过期数据,它是虚无缥缈的,任何针对它的查询都会真正触及底层表。

索引视图确实存储它自己的副本,但在查询计划中,您会看到任何插入/更新/删除也包括对视图的相关更改,因此数据保持一致。

【讨论】:

【参考方案3】:

它们始终是最新的。视图不是持久对象。当您查询视图时,您实际上是在查询构成视图的基础表等。因此,您的视图将与您的表格一样是最新的。

【讨论】:

值得注意的是,索引视图是一个持久化/物化对象。【参考方案4】:

view 提供最新信息。但在某些情况下它会失败,即当批量数据插入我们的表时,它不会更新基表数据以供查看。

要解决上述问题,您需要使用 sp_refreshview 'ur view name'

【讨论】:

【参考方案5】:

典型的视图(非索引/非物化)只是 SELECT 的别名。它不能过时,就像 SELECT 一样。

【讨论】:

【参考方案6】:

我发现当从不同的数据库中检索数据时,视图确实会返回错误的数据。例如,在我的设置中,我有一个视图可以从另一个数据库的表中进行简单的选择:

SELECT status FROM otherdb.dbo.mytable_t

这会返回:

空 接受 等待 IMPORTOK 进口PB 进步 拒绝

但是在 otherdb 上运行 SELECT status FROM mytable_t 会返回:

活跃 AFS 改变 草稿 PENDCONF 潘迪尼特 回顾 期限

在这种情况下,确保视图返回与 SELECT 相同的数据的唯一方法是删除并重新创建视图。

我在 SQL Server 2000、2005 和 2008 上看到过很多次。

【讨论】:

以上是关于Sql Server 视图是不是始终是最新的?的主要内容,如果未能解决你的问题,请参考以下文章

根据 SQL Server 中的最新日期创建具有过滤值的新视图的最佳方法是啥?

如何确保物化视图始终是最新的?

如何在 SQL Server 中使用子查询而不是视图

怎么查看sql server 最新版本和某版本的最新补丁

SQL Server 2005 视图

在 package.json 中使用 * 而不是版本号时如何始终获取最新版本? [复制]