我需要备份表及其数据作为软件测试的一部分。确切的表格及其包含的数据可能会有所不同,因此我无法对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 || ''
两种方法中哪一种更快?
答案 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将包含大多数这些对象,这会显着增加复制数据所需的时间。 (尽管您可能希望这些对象存在以供选择,验证等)。