在数据仓库方案中使用WITH(NOLOCK)有任何不利之处

Cad*_*oux 8 sql-server nolock sql-server-2005 data-warehouse

我有一个Kimball风格的DW(星型模型中的事实和维度 - 没有迟到的事实行或列,没有列的尺寸变化,除了过期作为类型2缓慢变化的尺寸的一部分),每日处理繁重以插入和更新行(新日期)以及每月和每日报告流程.事实表按日期划分,以便轻松滚动旧数据.

我理解WITH(NOLOCK)可以导致读取未提交的数据,但是,我也不希望创建任何会导致ETL进程失败或阻塞的锁.

在所有情况下,当我们从DW读取时,我们正在从事实表中读取一个不会改变的日期(事实表按日期划分)和维度表,这些表不会因为链接到的事实而改变属性.

那么 - 有什么缺点吗?- 可能在执行计划中或在SELECT相同表中并行运行的此类非常查询的操作中.

Raj*_*Raj 5

这是你可能需要的:

`ALTER DATABASE AdventureWorks SET READ_COMMITTED_SNAPSHOT ON;

ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON; `

然后继续使用

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

在你的查询中.根据BOL:

READ COMMITTED的行为取决于READ_COMMITTED_SNAPSHOT数据库选项的设置:

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

如果READ_COMMITTED_SNAPSHOT设置为ON,则数据库引擎使用行版本控制为每个语句显示事件一致的数据快照,因为它存在于语句的开头.锁不用于保护数据免受其他事务的更新.

希望这有帮助.拉吉


dkr*_*etz 2

只要都是不更新的数据就没有坏处,但如果也有很多好处,我会感到惊讶。我想说值得一试。最糟糕的情况是,如果您正在进行批量插入,您将获得不完整和/或不一致的数据,但您可以决定这是否会使任何有用的内容无效。

  • 那么我认为对您的具体问题的简单答案是,使用WITH(NOLOCK)将减少并可能消除您创建任何导致ETL进程失败或阻塞的锁的可能性;而且这种策略不会产生任何缺点。您有很多关于更奇特的方法来完成大致相同的事情的建议,但它们通常涉及您可能无权访问的全局服务器设置更改,并且您的数据库管理员会对此表示怀疑。 (2认同)