sqlserver视图是否始终是最新的还是会有延迟?
答案 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上已经看过很多次了。