1

我有三个表 UserTable、UserTablebBackUp 和 UserBlackList。每个表有大约 35M 的数据。

我想将每个元组从 UserTable 迁移到 UserTablebBackUp ,其中条目不在 UserBlackList 中。创建了一个脚本如下。你有办法优化这个脚本吗?否则它是最好的吗?谢谢。

insert /*+APPEND+*/ INTO UserTablebBackUp (id_backup) select id from UserTable 
        where id not IN (SELECT id from UserBlackList);
4

2 回答 2

1
insert /*+APPEND+*/ INTO UserTablebBackUp(id_backup) select a.id from usertable a
left outer join userblacklist b on a.id=b.id where b.id is null 

它应该更快...

于 2013-09-04T14:12:37.363 回答
0

并行性 使用 35M 行,您可能会受益于并行执行。但是有很多要求,例如企业版、并行设置、健全的硬件配置、足够的资源等。

如果您使用的是 11gR2,它可能就像这样简单:

insert /*+ APPEND PARALLEL*/
INTO UserTablebBackUp (id_backup) select id from UserTable 
where id not IN (SELECT id from UserBlackList);

Direct-Path Writes您可能已经得到了这个,但值得仔细检查。
单独的 APPEND 提示并不总是足够的,直接路径写入有很多限制。如果您使用的是直接路径插入,您应该LOAD AS SELECT在执行计划中看到,而不是LOAD TABLE CONVENTIONAL. 如果您仍然获得常规插入,请参阅SQL 语言参考以了解一些限制,以及 这个有用的 nologging 设置矩阵。

即使对于这样一个简单的查询,您也应该始终发布解释计划。

于 2013-09-04T18:24:31.080 回答