oracle 9i에서 작업 중입니다. 나는 135,000,000 개의 레코드를 가진 테이블을 가지고 있는데, 각각의 파티션은 약 1 개의 파티션을 가지고있다. 10,000,000 개의 행 모든 색인 및 모든.오라클에 많은 수의 데이터가 포함 된 쿼리 삭제
새로운 비즈니스 요구 사항으로 약 70,000,000 개의 행을 삭제해야합니다.
그래서 별도의 테이블로 삭제할 행의 백업을 만들었습니다.
Table1 <col1, col2........> -- main table (135,000,000 rows)
Table2 <col1, col2........> -- backup table (70,000,000 rows)
다음 쿼리를 삭제하려고 시도했습니다.
Delete from table1 t1 where exists (select 1 from table2 t2 where t2.col1 = t1.col1)
그러나 무한한 시간이 걸립니다.
는도 여전히 이상 12 시간 운영하고declare
cursor c1 is
select col1 from table2;
c2 c1%rowtype;
cnt number;
begin
cnt :=0;
open c1;
loop
fetch c1 into c2;
exit when c1%notfound;
delete from table1 t1 where t1.col1 = c2.col1;
if cnt >= 100000 then
commit;
end if;
cnt:=cnt+1;
end loop;
close c1;
end;
을 시도했다. 아직 완료되지 않았습니다.
table1에는 여러 개의 인덱스가 있고 table2에는 col1의 인덱스가 있습니다. 모든 테이블과 인덱스가 분석됩니다.
이 시나리오를 위해 최적화 할 방법이 있는지 알려주십시오.
감사합니다.
코드가 실제로 그렇게 보이면 행 100000 이후의 모든 행을 커밋합니다. 이는 원하는 것이 아니며 느리게 진행될 것입니다. 커밋 후 cnt : = 0을 설정하십시오. –
예 카운터 재설정이 필요합니다. 오타가 남아 있다고 생각합니다. 하지만 색인을 삭제하고 최상위 답변으로 다시 만드는 것이 더 좋았습니다. –