0

情况:

  • 我有一张桌子 A。

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

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

*更改索引 your_index 不可用;*

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

*改变系统设置skip_unusable_indexes = true;*

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

好的,这里有一个问题:

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

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

我的意思是,在大型系统中这种情况并不罕见——要加载大量数据,但系统需要保持响应。


总而言之 - 分区和分区交换看起来像是要走的路

4

2 回答 2

2

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

根据具体情况,您可能会受益于以这样的方式对表进行分区,即可以将大负载完成到临时表中,索引建立在临时表上,并进行分区交换以交换新的, 表中的空分区,用于您刚刚填充的临时表。当然,如果不了解更多关于数据的信息,就不可能知道以这种方式对表进行分区是否可行,或者它是否会对查询性能产生其他负面影响。

于 2012-08-06T16:50:26.970 回答
0

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

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

您的情况不是我以前遇到过的,因为我处理的大量数据负载是在系统处于非活动状态或在线用户数量较少的情况下完成的。

于 2012-08-06T19:42:10.187 回答