当前位置: 首页 > 知识库问答 >
问题:

在Oracle中插入2000万行的最快方法

法和安
2023-03-14

我正在尝试从一个oracle数据库迁移到另一个。我的选择查询非常复杂,它返回大约2000万条记录。当我尝试执行时:

insert into xxx
select a, b, c, bla blaa
from yyy join zzz join ttt etc

大约需要20个小时。

有什么不同的迁移方式吗?你能给我一些建议吗?

谢谢你的建议。

编辑:我创建了一个新表格,如下所示

将表XYZ创建为从yyy join zzz join ttt等中选择a,b,c,bla blaa

大约需要2分钟。

现在我正在尝试从XYZ插入到我的原始表。

还剩15分钟,继续进行:)

我将通知您:)

共有3个答案

孙言
2023-03-14

您可以尝试这个东西,首先使用您的查询创建一个表,然后从新创建的表中插入行,例如。

create table XYZ as 
select a, b, c, bla blaa
from yyy join zzz join ttt etc

insert into xxx
select a, b, c, bla blaa
from XYZ
刘俊语
2023-03-14

操作的哪一部分花费的时间最多?是运行原始查询所涉及的工作(返回所有行的时间,而不仅仅是第一行),还是在数据库之间传输数据的时间(它们是在同一台计算机上,还是在同一数据中心的不同计算机上,还是在世界的另一端),或者将数据插入表中(写入数据本身和UNDO / REDO?), 还是在目标表上维护索引和/或约束(如果有)?

一般来说,简单地插入...从中选择...查询将是移动数据最快的方式,除非两者之间的网络连接很慢。由于SQL*Net传输中缺乏内在并行性,非常大的数据集可能会有问题,但2000万行通常不算数。

作为您可以在那里执行的优化的一种体验,SQL * Net具有压缩数据包内发送的数据的功能,因此,如果网络时间很长,并且可以通过在SELECT阶段对数据进行排序来激发更好的压缩,并且ORDER不会显着增加SELECT查询时间, 然后,您可以提高整体表现。但是,您必须考虑所有这些因素。

SELECT查询可能会快速返回最初的几个数据行,但它可能无法很好地优化以快速返回所有行。默认情况下,作为INSERT的一部分调用SELECT应该会有所帮助,但只有通过运行包含INSERT子句的解释计划,您才有机会了解实际的查询优化计划。

可以使用直接路径插入(APPEND 优化器提示)提高数据插入的速度,但这需要独占锁,并且还有其他一些记录在案的限制。

导出/导入方法需要在源数据库上运行相同的查询,然后磁盘写入和磁盘空间来写入文件,然后磁盘读取和网络时间和磁盘写入来迁移它们,然后磁盘空间将它们存储在目标机器上,然后磁盘读读文件,然后在目标上使用与insert语句几乎相同的数据插入选项,因此,除非您打算使用表空间传输,否则我会考虑这是否真的是一种改进。

长话短说 -- 实际上是什么减慢了这个过程 你是否看到源数据库、目标或网络上的高负载?

轩辕风华
2023-03-14

使用SQL查询在数据库之间移动大量数据可能是最糟糕的方法。

如果必须这样做,至少提前打开目标表中的所有约束,它们将在处理过程中占用相当多的CPU。

更好的方法:Oracle提供导入/导出和卸载/加载的实用程序,例如可以在此处找到。

 类似资料:
  • 我有一个查询,它从另一个表中填充表数据。现在它看起来像这样。 在10 000条记录上,它执行大约10秒。但是会有10,000,000条记录的情况,恐怕它会很慢。我能做得更快吗?

  • 问题内容: 我正在寻找一种在Oracle 9数据库中执行多行插入的好方法。以下内容在MySQL中有效,但Oracle似乎不支持以下内容。 问题答案: 这在Oracle中有效: 这里要记住的是使用语句。

  • 问题内容: 我试图找出如何使用c#在SQL Server的临时表中提高插入性能的方法。有人说我应该使用SQLBulkCopy,但是我一定做错了,因为它看起来比仅仅构建一个SQL插入字符串要慢得多。 我使用SQLBulkCopy创建表的代码如下: 这样,我的插入内容需要很长时间才能运行。我用其他方法使嵌件工作得更快: 我将插入位创建为字符串,并将其加入到我的SQL create temp table

  • 我已经创建了复制分支用户权限的方法。权限通常为0到120个项目。运行此方法将此(0到120)项插入到7个用户ID需要35-55秒才能插入到表中。 我需要优化这个过程,因为数据插入的性能很慢。我在想如果超过10个用户,那么这个过程会花费太长时间。有没有办法提高插入数据的性能速度? 提前谢谢你!

  • 问题内容: 目前,我正在使用扫描仪/文件阅读器,同时使用hasnextline。我认为这种方法效率不高。还有其他方法可以读取与此功能类似的文件吗? 问题答案: 您会发现这是所需的速度:您可以每秒读取数百万行。字符串拆分和处理很可能导致遇到的任何性能问题。

  • 问题内容: 我正在寻找将数百万个元组批量插入数据库的最有效方法。我正在使用Python,PostgreSQL和psycopg2。 我已经创建了很长一段时间的流氓列表,应该将其插入数据库中,有时还要使用诸如geometric这样的修饰符。 幼稚的方法是对语句列表进行字符串格式化,但是我还了解了三种其他方法: 使用绑定样式进行参数插入 在元组列表上使用,以及 使用将结果写入文件并使用。 似乎第一种方法