【发布时间】:2009-12-04 12:17:01
【问题描述】:
sqlserver 视图是否总是最新的,还是会有延迟?
【问题讨论】:
标签: sql-server view
sqlserver 视图是否总是最新的,还是会有延迟?
【问题讨论】:
标签: sql-server view
这取决于视图运行的transaction isolation 级别。默认情况下,视图在READ COMMITTED 运行。该视图将仅返回已提交的数据。只要您的视图只包含一条 SQL 语句,并且不调用用户定义的函数或扩展过程,就可以保持一致。
但视图也可以在风险更大的隔离级别上运行。例如,这个视图指定了nolock,所以它运行在READ UNCOMMITTED:
create view dbo.MyView
as select * from dbo.MyTable with (nolock)
此视图可以返回属于将回滚(脏读)事务的一部分的值。此事务隔离级别以一致性换取性能。
【讨论】:
非索引视图本质上不能存储过期数据,它是虚无缥缈的,任何针对它的查询都会真正触及底层表。
索引视图确实存储它自己的副本,但在查询计划中,您会看到任何插入/更新/删除也包括对视图的相关更改,因此数据保持一致。
【讨论】:
它们始终是最新的。视图不是持久对象。当您查询视图时,您实际上是在查询构成视图的基础表等。因此,您的视图将与您的表格一样是最新的。
【讨论】:
view 提供最新信息。但在某些情况下它会失败,即当批量数据插入我们的表时,它不会更新基表数据以供查看。
要解决上述问题,您需要使用 sp_refreshview 'ur view name'
【讨论】:
典型的视图(非索引/非物化)只是 SELECT 的别名。它不能过时,就像 SELECT 一样。
【讨论】:
我发现当从不同的数据库中检索数据时,视图确实会返回错误的数据。例如,在我的设置中,我有一个视图可以从另一个数据库的表中进行简单的选择:
SELECT status FROM otherdb.dbo.mytable_t
这会返回:
空
接受
等待
IMPORTOK
进口PB
进步
拒绝
但是在 otherdb 上运行 SELECT status FROM mytable_t 会返回:
活跃
AFS
改变
草稿
PENDCONF
潘迪尼特
回顾
期限
在这种情况下,确保视图返回与 SELECT 相同的数据的唯一方法是删除并重新创建视图。
我在 SQL Server 2000、2005 和 2008 上看到过很多次。
【讨论】: