gpt4 book ai didi

sql - Oracle SQL 哪个更高效?并行创建表作为选择或并行插入?

转载 作者:行者123 更新时间:2023-12-01 12:57:48 25 4
gpt4 key购买 nike

作为软件测试的一部分,我需要备份表及其数据。确切的表和它们包含的数据可能会有所不同,因此我无法对 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 || ''

这两种方法哪个更快?

最佳答案

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

CTAS 需要先执行 DDL 来创建表,然后再进行加载。但是,这是少量的固定工作。复制的表越大,系数越小。

最后,我只想提一下,您应该查看 NOLOGGING 以进一步提高性能。

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

请注意,如果您决定使用 NOLOGGING,则需要了解一些事项。首先,只有 直接加载不会进行日志记录。对于表,这意味着 CTAS 和带有 PARALLEL 或 APPEND 提示的 INSERT。

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

希望对您有所帮助。

关于sql - Oracle SQL 哪个更高效?并行创建表作为选择或并行插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com