哪个Oracle SQL效率更高? PARALLEL创建表作为SELECT或PARALLEL INSERT?

时间:2012-01-03 21:54:49

标签: sql oracle

我需要备份表及其数据作为软件测试的一部分。确切的表格及其包含的数据可能会有所不同,因此我无法对DDL或数据进行硬编码。备份表的名称与原始表的名称相似,但前缀为“QA_”。类似但不相同(除了前缀),只是因为为了解决表名的31个字符限制,我必须缩写一些名称。

这样做的速度更快?使用游标对象并循环遍历表以获取它们的DDL:

select dbms_metadata.get_ddl(''TABLE'',' || '''' || cursor_rec.object_name || '''' || ') from dual

使用该DDL创建备份表,然后使用以下内容填充这些表:

INSERT /*+ parallel(' || new_table_name || 'DEFAULT) */ INTO '  || new_table_name  || ' SELECT  * FROM '  || table_name  || ''

或做一个简单的事:

CREATE TABLE' || new_table_name 'PARALLEL AS SELECT * from ' || table_name || ''

两种方法中哪一种更快?

2 个答案:

答案 0 :(得分:4)

嗯,INSERT /*+ PARALLEL */CREATE TABLE .... PARALLEL AS SELECT ...都要进行直接加载插入。因此,他们在很大程度上将使用相同的代码路径来进行数据加载。

在继续加载之前,CTAS需要首先执行DDL来创建表。但是,这是少量的固定工作。要复制的表越大,所用的因子就越小。

最后,我要提一下,您应该调查NOLOGGING以进一步提高效果。

在CTAS上,您只需在NOLOGGING关键字后添加PARALLEL关键字即可。对于INSERT /*+ PARALLEL */,您需要先ALTER TABLE ... NOLOGGING启用它。

请注意,如果您决定使用NOLOGGING,则需要了解一些事项。首先,直接加载将进行nologging。对于表格,这意味着CTAS和INSERT与PARALLEL或APPEND提示。

其次,考虑NOLOGGING的恢复影响。当表格加载NOLOGGING选项时,数据 NOT 记录到REDO。因此,您将无法恢复表中的数据,除非您在数据成功加载并提交后使用备份。

希望有所帮助。

答案 1 :(得分:0)

Create-table-as通常会更快,因为它不包含很多选项,例如“主键,唯一键,外键,检查约束,分区条件,索引和列默认值”。

默认情况下,DBMS_METADATA将包含大多数这些对象,这会显着增加复制数据所需的时间。 (尽管您可能希望这些对象存在以供选择,验证等)。