2014-01-09 62 views
0

我在表中插入了数百万条记录,这样的操作将需要数小时甚至一天的时间。 2小时后,通过我的电脑连接断开,所以我想从头开始重复插入。
我的问题
哪个更快?截断表并重复一次,创建主键并继续,但是由于在过去2小时内插入的每条记录都存在'违反唯一约束',因此会引发错误。违反错误性能的唯一约束条件

+0

你是如何做插入?为什么从一开始就重复如果已经提交了一些数据 - 不会从第一次插入的第一个记录开始更有意义? (希望你一次不插入/提交一行......并且没有任何索引或触发器)。 –

+0

@AlexPoole我有一张包含数百万条记录的表格,我想将它分成4个表格。原始表具有日期栏(第1年2年3年和第4年),因此每年在原表中将数据插入表1。所以在我的场景中,我将orignal的数据插入到4个表中。 – Moudiz

+0

但是由什么机制?你正在做'insert into new_table_1 select ... from orig_table where year = ...',或者选择所有的记录,循环它们,然后决定哪个表格可以逐一插入每条记录?在什么环境/语言中 - 听起来你可能把整个表格通过网络拉回到你的电脑,然后将它推回到四个新表格中,这将会很慢,而不是在数据库中完成所有工作。当然,这并不是真正的问题。 (你有没有考虑过分区?)。 –

回答

1

截断表(如果完全刷新)是最好的选择。如果使用Oracle的SQL*Loader实用程序,还有SKIP参数。让我在一定程度上解释!

另请尝试使用加载选项DIRECT加载SQL * Loader表。这意味着通过加载到数据块而不是传统的INSERT语句来加载表。

通过这种负载,可以启用UNRECOVERABLE,这意味着没有/较少的重做日志写的,因此加载速度非常快> 70比传统INSERT%。

但是,这种装载的缺点是,此表上的所有索引,除了NULL约束将进行UNUSABLE,装载开始前,数据将被加载。并且在SUCCESSFUL完成时,SQL*Loader试图通过重建它来重新启用索引。所以,如果万一我的任何原因,加载已经中断,错误信息将被正确记录,并且索引将被保留为UNUSABLE

的更多详细信息:请找Here
DIRECT/CONVENTIONAL加载)

此外,使用SQL*Loader,您可以加载使用Conventional加载,这意味着SQL*Loader将使用该文件生成的INSERT的块,并且过程它。在这种类型的加载中,所有的INDEXES都将保持原样,并且表格仍然没有受到伤害。

如果发生任何错误,SQL*Loader将记录一个SKIP参数,这意味着,如果您指定该数字,则在下一次运行时,将从该文件的该点加载该表。

更多细节SQL*LoaderHere

+0

我正在运行pl/sql,所以我cannut使用sql * loader但是很好的解释。 – Moudiz

0

不知道你是如何加载你的表,但是这是一个典型的情况下,你应该使用Oracle的外部表。

+0

你的意思是通过外部的oracle表吗? – Moudiz

+0

简而言之,使用外部表格,您可以直接从数据文件查询数据。请转至此[文档](http://docs.oracle.com/cd/B28359_01/server.111/b28319/et_concepts.htm#g1017623)以获取更多信息。 – San

相关问题