2009-12-10 25 views
0

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

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

+0

您将不得不定义插入'失败',由于查询执行时间导致的简单超时,还是它是关键失败? – Andrew 2009-12-10 09:13:09

+0

还不知道,但我很确定它超时。 – 2009-12-10 09:44:48

+0

如果不知道所用技术的具体细节,我们无法给出具体答案。也许你的“数据仓库”解决方案是错误的技术?几周前有一些有趣的问题/答案。 – 2009-12-10 10:00:04

回答

1

我已经使用了normalized和Kimball星型数据仓库,这听起来不像是应该遇到的问题。即使在小型数据仓库中,我也会说140000行不是很多行。

为什么插入失败?通常在Kimball风格的仓库中,没有任何插入操作失败 - 例如在事实表中,插入操作始终有一组唯一与尺寸和颗粒相关的主键(如日期或时间快照)。在dimmension表中,检测到变化,插入新的尺寸,现有的尺寸被重新使用。在规范化的仓库中,您通常会有某种修订机制或存档流程或生效日期,以保持唯一性。

在我看来,无论您的DW理念或体系结构如何,都应该保持这些行的独特性。 (如你在评论中所述),你有一个包含每一列的索引,这可能不是一个非常有用的索引(在任何数据库设计中)。你确定你的索引甚至被用于任何查询吗?它是否也被标记为独特的,是否违反了约束条件?无论如何,这是一个相当大的多列索引,与比较会相对昂贵 - 这可能会导致超时 - 您可以随时修复连接中的问题以永久等待,但我会从一个设计视角。

2

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

2

140K不是很多行。 请张贴您的餐桌设计和插入失败时您收到的错误

1

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