我有一张170亿行的表。我想删除其中一些,存在于另一个表中。
我尝试了一个并行化的删除语句,因为临时空间不够而无法完成。
delete /* + PARALLEL(a, 32) */
from a
where (a.key1, a.key2) in
(select /*+ PARALLEL(b, 16) */
key1,
key2
from b);
然后我尝试创建表格作为选择,因为同样的原因也失败了。
create table a_temp parallel 32 nologging as
select /* + PARALLEL (a, 32) */
key1,
key2,
rest_of_data
from a
where (a.key1, a.key2) not in
(select key1, key2 from b);
常规(没有PARALLEL)删除时间超过一天所以我不得不终止它。
有没有办法释放临时空间,因为在删除执行期间不再需要它?
我还有其他办法吗?
编辑: B有1.73亿条记录,必须删除近160亿条记录(几乎整个表格)。桌子上没有索引。
EDIT2: create table的解释计划如下:
CREATE TABLE STATEMENT, GOAL = ALL_ROWS 6749420 177523935 10828960035
PX COORDINATOR
PX SEND QC (RANDOM) SYS :TQ10001 6740915 177523935 10828960035
LOAD AS SELECT (HYBRID TSM/HWMB) USER A_TEMP
OPTIMIZER STATISTICS GATHERING 6740915 177523935 10828960035
MERGE JOIN ANTI NA 6740915 177523935 10828960035
SORT JOIN 6700114 17752393472 745600525824
PX BLOCK ITERATOR 45592 17752393472 745600525824
TABLE ACCESS FULL USER A 45592 17752393472 745600525824
SORT UNIQUE 40802 173584361 3298102859
PX RECEIVE 5365 173584361 3298102859
PX SEND BROADCAST SYS :TQ10000 5365 173584361 3298102859
PX BLOCK ITERATOR 5365 173584361 3298102859
TABLE ACCESS FULL USER B 5365 173584361 3298102859
提前致谢
答案 0 :(得分:0)
为了解决这个问题,我一次批量删除了〜1M。经过大量挖掘更清洁的解决方案后,DBA坚持采用这种方法。
这是我的工作流程:
我使用Python和cx_Oracle
模块读取待删除记录的PK值,迭代地将它们作为绑定变量插入到executemany
调用中,并在每次迭代后提交。
如果您想坚持并行执行方法:
请记住使用ALTER SESSION ENABLE PARALLEL DML
,以便并行执行合并或删除。看看这篇精彩的博客文章,它将引导您完成此操作:
https://dioncho.wordpress.com/2010/12/10/interpreting-parallel-merge-statement/
答案 1 :(得分:0)
我使用不同的解决方案使其成功。
我手动创建了insert
表,并使用APPEND PARALLEL
提示进行了create table a_temp(..);
insert /* + APPEND PARALLEL(a_temp, 32) */
into a_temp(...)
select /* + PARALLEL(a, 32) */
(...)
from a
where not exists
(select /* + PARALLEL(b, 16) */
'1'
from b
where a.key1 = b.key1
and a.key2 = b.key2)
。没有超出温度空间,插件表现完美。
以下是代码:
dateFormat