sql-server - 在数据仓库场景中使用WITH(NOLOCK)有什么缺点

标签 sql-server sql-server-2005 data-warehouse nolock

我有一个 Kimball 式的 DW(星型模型中的事实和维度 - 没有迟到的事实行或列,没有列在维度上发生变化,除了作为 2 型缓慢变化维度的一部分到期之外),需要进行繁重的日常处理来插入和更新行(在新日期)以及每月和每日报告流程。事实表按日期分区,以便轻松滚动旧数据。

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

在所有情况下,当我们从 DW 读取数据时,我们从事实表中读取不会更改的日期(事实表按日期分区)和维度表,这些表的属性不会因事实而更改链接到。

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

最佳答案

这可能是您需要的:

`更改数据库 AdventureWorks 设置 READ_COMMITTED_SNAPSHOT ON;

更改数据库 AdventureWorks 将 ALLOW_SNAPSHOT_ISOLATION 设置为 ON; `

然后继续使用

设置事务隔离级别已提交读

在您的查询中。根据玻尔:

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

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

如果 READ_COMMITTED_SNAPSHOT 设置为 ON,数据库引擎将使用行版本控制为每个语句提供事务上一致的数据快照(与语句开始时存在的数据相同)。锁不用于保护数据免遭其他事务的更新。

希望这有帮助。 拉杰

关于sql-server - 在数据仓库场景中使用WITH(NOLOCK)有什么缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1014993/

相关文章:

postgresql - ETL 工具还是临时解决方案?

sql-server - Microsoft 立方体使用边界和最佳实践

sql-server - 将 SQLite 数据库迁移到 Microsoft SQL Server

sql - SQL Server 2005发送邮件

sql - 转换为 Integer 无法正常工作?

sql - 如何在 SQL SERVER PROCEDURE 中重用选择结果

sql - 如果我更新 View ,我的原始表会更新吗

amazon-redshift - Redshift 和超宽表

sql - 给每个group id设置group的最大值

sql - 转换 SQL 表