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

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

【问题讨论】:

    标签: sql-server view


    【解决方案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 上看到过很多次。

            【讨论】:

              猜你喜欢
              • 2015-06-08
              • 1970-01-01
              • 2019-10-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-12
              • 1970-01-01
              • 2014-06-20
              相关资源
              最近更新 更多