Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle中的数据加载_Oracle - Fatal编程技术网

Oracle中的数据加载

Oracle中的数据加载,oracle,Oracle,我在加载数据时遇到问题。我必须在Oracle数据库中将800000行从一个表复制到另一个表 我先试了10000行,但花的时间并不令人满意。我尝试使用bulkcollect和INSERT-INTO-SELECT子句,但对于这两种情况,响应时间都在35分钟左右。这不是我想要的回应 有人有什么建议吗?Anirban 在SELECT中使用INSERT是填充表的最快方法。您可能希望通过以下一个或两个提示对其进行扩展: APPEND:使用直接路径加载,绕过缓冲区缓存 并行:如果您的系统有多个cpu,并且这是

我在加载数据时遇到问题。我必须在Oracle数据库中将800000行从一个表复制到另一个表

我先试了10000行,但花的时间并不令人满意。我尝试使用bulkcollect和INSERT-INTO-SELECT子句,但对于这两种情况,响应时间都在35分钟左右。这不是我想要的回应

有人有什么建议吗?

Anirban

在SELECT中使用INSERT是填充表的最快方法。您可能希望通过以下一个或两个提示对其进行扩展:

APPEND:使用直接路径加载,绕过缓冲区缓存 并行:如果您的系统有多个cpu,并且这是一次性操作,或者在一个自私的进程消耗更多资源无关紧要的情况下执行操作,则使用并行处理。 仅在我的笔记本电脑上使用append提示,就可以在5秒以下复制800000个非常小的行:

SQL> create table one_table (id,name)
  2  as
  3   select level, 'name' || to_char(level)
  4     from dual
  5  connect by level <= 800000
  6  /

Tabel is aangemaakt.

SQL> create table another_table as select * from one_table where 1=0
  2  /

Tabel is aangemaakt.

SQL> select count(*) from another_table
  2  /

  COUNT(*)
----------
         0

1 rij is geselecteerd.

SQL> set timing on
SQL> insert /*+ append */ into another_table select * from one_table
  2  /

800000 rijen zijn aangemaakt.

Verstreken: 00:00:04.76
你提到在你的情况下,这个手术需要35分钟。你能发布更多的细节吗,这样我们就可以知道35分钟到底花了多少时间

问候,,
罗伯。

我同意罗伯的观点。“插入选择”是执行此操作的最快方法

你到底需要做什么?如果您试图通过复制到新表然后删除旧表来进行表重命名,则最好进行表重命名:

alter table
   table
rename to
   someothertable;

插入选择是最快的方法

如果可能/必要,首先禁用目标表上的所有索引


如果目标表中没有现有数据,也可以尝试创建为选择。

如上所述,我建议插入到。。。作为选择。。。。或者创建表。。。作为选择。。。作为在两个表之间复制大量数据的最快方式

您希望在oracle文档中查找直接加载插入。这会在语句中添加两项:并行和无日志。重复测试,但执行以下操作:

CREATE TABLE Table2 AS SELECT * FROM Table1 where 1=2;
ALTER TABLE Table2 NOLOGGING;
ALTER TABLE TABLE2 PARALLEL (10);
ALTER TABLE TABLE1 PARALLEL (10);
ALTER SESSION ENABLE PARALLEL DML;
INSERT INTO TABLE2 SELECT * FROM Table 1;
COMMIT;
ALTER TABLE 2 LOGGING:

这将关闭表中插入的回滚日志记录。如果系统崩溃,则无法恢复,并且无法对事务执行回滚。并行程序使用N个工作线程以块的形式复制数据。您必须测试并行工作线程的数量,才能在系统上获得最佳结果

您要复制到的表是否与另一个表的结构相同?它是否有数据,或者您正在创建新数据?你能用进出口吗?Exp可以提供一个查询来限制它导出的内容,然后导入到数据库中。要从中复制的表的总大小是多少?如果要将大部分数据从一个表复制到另一个表,是否可以改为使用exp/imp复制整个表,然后删除不需要的行,这比复制要少。

尝试删除目标表上的所有索引/约束,然后在数据加载后重新创建它们

使用n/Ac+nOctRe/TooT,以防使用NoSoCurrOG模式,或考虑在操作后做备份。