Oracle11g 从oracle中的两个大表中删除公共数据的最佳方法?
我试图从表A中删除数据,其中匹配表B中的记录。A、B两个表都是大表,每个表的大小约为80GB。你能告诉我完成表A数据删除的最佳方法吗?我使用的sql是:Oracle11g 从oracle中的两个大表中删除公共数据的最佳方法?,oracle11g,Oracle11g,我试图从表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)
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;
PROCEDURE del_PROCEDURE(col_value_from_B INTEGER)
是
sql_stmt VARCHAR2(2000年);
col_val_from_A整数:=0;
开始
从表B中的表格A中选择最大值(col1)到列值
其中,b.col ||“a.col1除非有很好的理由,否则我会:
DELETE FROM table_A a
WHERE a.col1 <= (SELECT MAX (col1)
FROM table_B b
WHERE b.col < col_value_from_B);
从表中删除
WHERE a.col1代码中提到了tableA吗?另外,如果我是你,我会删除整个异常块。或者至少,将raise\u应用程序错误
替换为raise
。(并且您意识到,SQLERRM
已经包含了SQLCODE
,对吗?所以无需再次附加它!)。简单的delete语句有什么问题?为什么你的delete语句是用动态sql编写的,而你可以轻松地用静态语句编写呢?修改了我用来删除的sql。是的。我打算每四分之一左右定期运行一次。但是我编写和测试的同一个sql花了24个多小时,最后失败了,出现了不可修复的mermory错误。因此,寻找更好和不同的方法来做同样的事情。