从远程数据库oracle

时间:2015-07-23 15:47:33

标签: oracle insert oracle10g oracle-xe

我正在使用Oracle XE 10.2。我试图使用语句

从远程数据库复制2,653,347行
INSERT INTO AUTOSCOPIA 
(field1,field2...field47)
SELECT * FROM AUTOS@REMOTE;

我正在尝试在本地复制所有2百万行的所有47列。然而,在运行几分钟后,我收到错误:

ORA- 12952 : The request exceeds the maximum allowed database size of 4 GB data.

如何避免此错误?

详细信息:我的本地表中有3个索引(我想插入远程信息)。

1 个答案:

答案 0 :(得分:1)

您正在使用Oracle 10.2的快速版,其中包含许多限制。您遇到的问题是您的表和索引的空间限制为4 GB。

  • GB中的表有多大?如果表有260万行,如果每行超过~1575字节,那么你想要做的就是不可能。你必须要么限制你要复制的数据量(不是每一行,没有获得每一列,或者没有获得某些列中的所有数据都是选项),或者你需要安装一个版本和版本这允许您存储那么多数据。 11.2的快速版允许您存储11 GB的数据,并且像10.2的快速版一样免费,因此这将是最简单的选择。您可以通过查询远程数据库中的all_segments列来查看该表在远程数据库中占用的空间大小 - 该值应该接近您在数据库中所需的空间量

请注意,这会忽略外部LOB段和索引

使用的空间
SELECT sum(bytes)/1024/1024/1024 size_in_gb
  FROM all_segments@remote
 WHERE owner = <<owner of table in remote database>>
   AND segment_name = 'AUTOS'
  • 如果表小于4 GB但表+索引的大小大于4 GB,那么您可以在本地复制数据,但是您需要删除您在该表上创建的一个或多个索引。复制数据之前的本地表。当然,这可能会导致性能问题,但您至少可以将数据导入本地系统。
  • 如果您(或其他任何人)在此数据库中创建了任何表,那么这些表也会计入您的4 GB数据库限制。删除它们会释放一些可用于此表的空间。
  • 假设您在本地复制后不会修改此表中的数据,您可能希望在定义表时使用PCTFREE 0。这样可以最大限度地减少每个块中保留的空间量,以便后续更新。