0

我们的产品同时对大约 350 名候选人进行测试。在测试结束时,每个候选人的结果都会被转移到一个充满索引的数据仓库中。对于每个测试,有大约 400 条记录要输入到数据仓库中。所以 400 x 350 是很多记录。如果数据仓库中的记录不多,一切顺利。但是如果数据仓库中已经有很多记录,那么很多插入都会失败......

有没有办法让索引只在一天结束时重建,或者这不是真正的问题吗?或者你会如何解决这个问题?

4

4 回答 4

2

在数据仓库中很常见的是在加载之前删除索引和约束,然后重新创建它们。如果您摆脱了约束 (FK),请确保您的加载过程会处理此问题。也删除任何检查约束,并将检查验证移动到 ETL 软件中,

于 2009-12-10T13:14:03.817 回答
2

140K 不是很多行。请发布您的表格设计以及插入失败时出现的错误

于 2009-12-10T22:47:03.197 回答
1

我使用过标准化和 Kimball 星型数据仓库,这听起来不像是您应该遇到的问题。我想说即使在小型数据仓库中,140000 行也不是很多行。

为什么插入失败?通常在 Kimball 风格的仓库中,没有任何插入会失败——例如在事实表中,插入总是有一组唯一的与维度和粒度相关的主键(如日期或时间快照)。在维度表中,检测到变化,插入新维度,重新使用现有维度。在规范化的仓库中,您通常具有某种修订机制或存档过程或生效日期,以保持事物的独特性。

在我看来,无论您的 DW 理念或架构如何,都应该有一些东西来保持这些行的独特性。

如果(正如您在评论中所述)您有一个包含每一列的索引,那么这可能不是一个非常有用的索引(在任何数据库设计中)。您确定您的索引甚至被用于任何查询吗?它是否也被标记为唯一并且是否违反了该约束?在任何情况下,这是一个相当大的多列索引,比较起来会相对昂贵——这可能会导致超时——你总是可以在连接中修复它以永远等待,但我会从一个设计视角。

于 2009-12-10T20:14:15.487 回答
1

我建议如下: 保留所有数据,除了今天的数据在单独的表中(我们称之为历史记录),其中索引已针对您的报告进行了调整。将今天的数据保存在另一个单独的表中(让我们称之为今天)并在午夜运行作业以将数据从今天表移动到历史表。在 Today 表中 - 您应该使用最少的索引来提高插入性能。通过实施此设计,您将确保您的报告不会因插入而拥挤。此外 - 你有两个表为他们的目的而调整。一般来说,很难为快速插入和快速选择调整表。

于 2010-01-28T15:39:19.990 回答