如何快速加载大量数据并保持数据库响应?

时间:2012-08-06 16:36:36

标签: database oracle indexing

情况:

  • 我有一张表A.

  • 我想将大量数据加载到表A中(比如说几百万条记录或更多)

好的,所以我寻找选项等,我得出结论,我应该在加载时间禁用表的索引ok:

*更改索引your_index不可用; *

但在加载过程中,其他进程和系统可以搜索表A中的数据并将数据插入表A.所以我需要使用:

* alter system set skip_unusable_indexes = true; *

加载数据后,我重建索引并清除标记。

好的,这里有一个问题:

  1. 将查询使用我的索引(当它设置为不可用时) - 我们正在谈论大表,没有索引会超时

  2. 如果1为真,那么在重新构建索引之前,新插入的记录会发生什么(我的意思是通过其他进程插入而不是批量加载),它们在查询时是否返回?有可能以某种方式部分重建索引/禁用一个会话并保留其他会话吗?

  3. 我的意思是在大型系统中不应该出现这种不常见的情况 - 要加载大量数据,但系统需要保持响应。


    总结一下 - 分区和分区交换看起来像是要走的路

2 个答案:

答案 0 :(得分:2)

如果索引不可用,查询将无法使用它。如果查询将超时,如果他们无法使用索引并且查询需要在加载数据的同时发生,则无法将索引标记为不可用。在加载过程中,您将不得不承担索引维护的开销。

根据具体情况,您可以通过以下方式对表进行分区,从而可以将大型负载放入登台表,在登台表上构建索引,并完成分区交换。在表中为刚刚填充的登台表交换一个新的空分区。当然,如果不了解有关数据的更多信息,就不可能知道以这种方式对表进行分区是否可行,或者是否会对查询性能产生其他负面影响。

答案 1 :(得分:0)

如果您的数据来自文件格式我想知道是否使用SQL * Loader是解决方案,因为它将为您提供您正在寻找的所有选项,即。禁用索引/约束,提交频率等。

这是一种高性能的数据加载工具。它可能适合或不适合您的需求,但它为您提供了另一种选择。

您之前遇到的情况不是我已处理的大量数据,当系统处于非活动状态或用户在线时处于较低时段时已完成。