业务规则不严格时最适合的事务隔离级别

Best suitable transaction isolation level when business rules are not strict

简短版本: 我正在尝试确定哪个是我们场所中 SQL 服务器的最佳事务隔离级别。

长版: 我正在从 API 调用中提取数据并将其加载到暂存 tables 中,然后逐步加载到目标 tables 中。这些目的地 table 有多种用途,其中一些在下面提到:

  1. 通过 SSIS 将数据加载到 CRM
  2. Feed PowerBI 报告(计划刷新)
  3. 对数据应用业务转换并将其加载到数据仓库
  4. 将数据提取到 excel 个文档中
  5. (最重要的是)在初始 ETL 过程之外对目标 table 进行更改(从 API 到暂存到目标)

由于数据集很大,我面临的问题是:

  1. 我通过使用临时 table 和 CTE
  2. 避免的死锁
  3. table 更新之间的长时间等待(因为一个更新目标 table 的存储过程可能会等待一个小时,直到另一个 table 不使用更新)
  4. 更新 SQL table 时,PowerBI 刷新等待时间长,有时刷新超时
  5. 长 Select 语句在更新 SQL table 时等待

鉴于:

  1. 我工作的行业不是银行业,也不是数据需要始终 100% 准确的行业
  2. PowerBI 报告每天只刷新两次
  3. 我也迫切需要将这些目的地 table 中的数据用于其他报告目的
  4. 数据集包含数百万条记录

suitable 这个场合的隔离级别是多少?或者通过 table 提示设置单独的隔离级别会更好吗?

注意 1:如果我们在报告刷新中有一些脏读,我和我的雇主不会介意,只要这意味着报告会以相应的方式刷新并且 tables 可以用于其他存储程序(读取和更新)无需等待。

注意 2:is_read_committed_snapshot_on 在我们的 SQL 服务器中为 0。

为数据库设置READ COMMITTED SNAPSHOT ISOLATION的READ COMMITTED,可以让读者读取时不会被写者阻塞,防止写者被读者阻塞,也不会造成脏读。

这是显而易见的第一步。