从oracle中的两个大表中删除常用数据的最佳方法是什么?

时间:2016-01-15 16:17:03

标签: 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) 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;

1 个答案:

答案 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将定期完成。)