SqlServer View是否始终是最新的?

时间:2009-12-04 12:17:01

标签: sql-server view

sqlserver视图是否始终是最新的还是会有延迟?

6 个答案:

答案 0 :(得分:10)

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

但是观点也可以在更高风险的隔离级别上运行。例如,此视图指定nolock,因此它在READ UNCOMMITTED运行:

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

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

答案 1 :(得分:4)

非索引视图本质上不能存储过时的数据,它是空灵的,任何针对它的查询都会真正触及基础表。

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

视图提供最新信息。但是在某些情况下它会失败,即当大量数据被插入到我们的表中时它就不会更新基表数据来查看。

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

答案 4 :(得分:0)

典型视图(非索引/非实现)只是SELECT的别名。它不能超过SELECT可以是过时的。

答案 5 :(得分:0)

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

SELECT status FROM otherdb.dbo.mytable_t

然后返回:

NULL
已接受
AWAITRTR
IMPORTOK
IMPORTPB
INPROGRE
REJECTED

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

ACTIVE
AFS
CHANGE
草案
PENDCONF
PENDINIT
回顾
TERM

确保视图返回与此场景中的SELECT相同的数据的唯一方法是删除并重新创建视图。

我在SQL Server 2000,2005和2008上已经看过很多次了。