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 视图是不是始终是最新的?的主要内容,如果未能解决你的问题,请参考以下文章