我正在尝试从表A中删除匹配表B中记录的数据.A,B表都是大表,每个表的大小约为80GB。能否建议我完成从表A中删除数据的最佳方法?我正在使用的sql是:
PROCEDURE del_procedure (col_value_from_B INTEGER)
IS
sql_stmt VARCHAR2 (2000);
col_val_from_A INTEGER := 0;
BEGIN
SELECT MAX (col1) into col_val_from_A FROM table_B b
WHERE b.col < col_value_from_B;
sql_stmt :=
'DELETE FROM table_A a'
|| 'WHERE a.col1 <= '
|| col_val_from_A
|| ' and rownum<= 500000 ';
LOOP
EXECUTE IMMEDIATE sql_stmt;
IF SQL%ROWCOUNT = 0
THEN
EXIT;
END IF;
COMMIT;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (SQLCODE || SQLERRM);
RAISE_APPLICATION_ERROR (-20002, SQLCODE || SQLERRM);
END col_val_from_A;
答案 0 :(得分:0)
除非有一个快乐的理由*我只是这样做:
DELETE FROM table_A a
WHERE a.col1 <= (SELECT MAX (col1)
FROM table_B b
WHERE b.col < col_value_from_B);
*不包含&#34;此语句导致UNDO表空间用完!&#34 ;;这只意味着您需要相应地增加UNDO表空间。 (唯一的例外,恕我直言,如果它是一次性的或很少执行的过程。在你的情况下,如果你正在为它编写程序,我猜测它是&#39; ; s将定期完成。)