代码之家  ›  专栏  ›  技术社区  ›  Cade Roux

在数据仓库场景中,与(NOLOCK)一起使用有任何缺点吗

  •  8
  • Cade Roux  · 技术社区  · 17 年前

    我有一个Kimball风格的DW(星型模型中的事实和维度-没有延迟到达的事实行或列,除了作为类型2缓慢变化维度的一部分到期外,维度中没有改变的列),每天都有大量的插入和更新行(在新日期)的处理,以及每月和每日的报告过程。事实表按日期进行分区,以便于旧数据的滚动。

    我理解 WITH(NOLOCK)

    那么-有什么缺点吗?-可能是在执行计划中,或在此类项目的运作中 SELECT -只有在同一个表上并行运行的查询。

    6 回复  |  直到 16 年前
        1
  •  5
  •   Raj    17 年前

    这是您可能需要的:

    将已提交的快照设置为打开;

    alterdatabaseadventureworks 设置允许\u快照\u隔离打开; `

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED

    在您的查询中。根据BOL:

    如果将READ_COMMITTED_SNAPSHOT设置为OFF(默认设置),则数据库引擎将使用共享锁来防止其他事务在当前事务运行读取操作时修改行。共享锁还阻止语句读取由其他事务修改的行,直到其他事务完成。共享锁类型决定何时释放它。在处理下一行之前,将释放行锁。读取下一页时释放页锁,语句完成时释放表锁。

    如果READ_COMMITTED_SNAPSHOT设置为ON,则数据库引擎将使用行版本控制为每个语句提供一个在语句开始时存在的数据事务一致性快照。锁不用于保护数据不受其他事务更新的影响。

    希望这有帮助。 拉吉

        2
  •  2
  •   dkretz    17 年前

    只要没有更新数据,就没有坏处,但如果有很多好处,我会感到惊讶。我认为值得一试。最坏的情况是,如果你在一个批处理插入中间,你会得到不完整和/或不一致的数据,但是你可以决定它是否无效任何有用的东西。

        3
  •  2
  •   Remus Rusanu    17 年前

    你考虑过创建一个 DATABASE SNAPSHOT 你的数据仓库,并运行你的报告吗?

        4
  •  1
  •   MatthewMartin muthu    17 年前

    对SQL的可读性将大大降低。您将不可避免地错过一些NOLOCK提示,因为使用NOLOCK策略的SQL SELECT命令必须将其放在所有地方。

    You can get the same thing by setting the isolation level

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    最后,您的性能提高了10%(对不起,我太懒了,请查看文章,但它就在那里)

    我认为10%的收益不值得降低可读性。

        5
  •  1
  •   Nick Kavadias    17 年前

    ALTER DATABASE adventureworks SET read_only
    
        6
  •  0
  •   monibius    16 年前

    NOLOCK执行脏读(indecentreaduncommitted执行与NOLOCK相同的操作)。如果在读取时正在更新数据库,则有可能返回不一致的数据。唯一的选择是接受锁定并因此进行阻塞,或者从SQL 2005以后提供的两个新隔离级别中选择一个 discussed here .

    推荐文章