Oracle11g 从oracle中的两个大表中删除公共数据的最佳方法?

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)

我试图从表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;
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错误。因此,寻找更好和不同的方法来做同样的事情。