我们正在我们的组织中建立一个数据仓库(以及一些数据集市)。我的 DBA 技能主要用于 OLTP 类型的应用程序,但我正在为我们的组织支持 OLAP。
我们最近遇到了一个问题,我们的一个 ETL 程序(在这种情况下,它恰好是用 Java 编写的消息驱动 Bean)正在使用可重复读取 (RR) 隔离级别。因此,他们遇到了锁。我显然质疑为什么要使用 RR。(编辑:我原本以为是DB2端的RR,但是从JDBC端得知这是RR,映射到DB2端的RS。从那以后我们也尝试了JDBC端的RC,也就是DB2端的CS . 这似乎解决了一些锁定问题。)
因此,我开始研究数据仓库的建议隔离级别,无论是从提要/源端还是从检索端。
我真的找不到太多。我发现一些文章提到未提交的读取 (UR) 对查询/检索方面有好处,但对馈送方面没有任何帮助。我在想应该使用光标稳定性(CS)或最高读取稳定性(RS)。我会支持 CS,但也许这被 OLTP 思想污染了?
在我们的例子中,我们仓库的主要提要现在是使用 Java 消息队列“实时”完成的。从仓库中检索将使用 ETL 工具(在我们的例子中为 DataStage)完成,可能作为夜间作业开始(一些用于每日报告,另一些用于月度或季度报告)。这些报告将基于我们的市场。因此,虽然仓库可能是“实时”的,但不会被读取或主动查询(至少现在不是)。
诚然,我们使用 DB2 9.7 FP 4(我们希望明年某个时候迁移到 10.1),并且某些细节可能因供应商而异,但是您认为 DBA 推荐的提要和读取隔离级别是什么?为什么?
此外,任何有关集市隔离级别的输入都将不胜感激。
编辑:这样就更容易与其他供应商进行比较。这是映射到 JDBC 隔离级别的 DB2 隔离级别名称表。(根据《理解 DB2:通过示例进行视觉学习》一书,因此版权所有 IBM。)
+------------------------------+-----------------------+ | JDBC | DB2 | +------------------------------+-----------------------+ | TRANSACTION_READ_UNCOMMITTED | Uncommitted Read (UR) | +------------------------------+-----------------------+ | TRANSACTION_READ_COMMITTED | Cursor Stability (CS) | +------------------------------+-----------------------+ | TRANSACTION_REPEATABLE_READ | Read Stability (RS) | +------------------------------+-----------------------+ | TRANSACTION_SERIALIZABLE | Repeatable Read (RR) | +------------------------------+-----------------------+
对于包括数据仓库在内的大多数数据库来说,Read Committed 是一个足够的隔离级别。由于答案可能不正确,我不会使用未提交的读取。在 SQL Server 上,我们还可以添加 Read Committed Snapshot Isolation。这对行进行版本化并避免查询被更新阻塞。不知道你在 DB2 上是否有类似的东西。
如果您将 DB2 设置为“只读”模式,我不确定 DB2 是否会自动选择最兼容的隔离级别,但在 MS SQL Server 中会。在您的作业运行前不久,您可以将其设为“只读”。通过这种方式,您可以确定有人不会在大型数据集市上进行更新,并且引擎会关闭锁定/阻塞问题,因为无论如何都没有人可以访问它。
正如 Andy 所指出的,将隔离级别设置为 READ UNCOMMITTED 可能会产生不利影响,但您的读者不会阻止作者,反之亦然。如果您执行 COUNT(*),您可能会看到截然不同的结果,但这实际上取决于您的加载时间和模式。
典型的每晚和每月负载需要多长时间?