2

識別子に 1 対 1 で関連付けられた 3 つのテーブルがあります。条件 A.ID = B.ID = C.ID に一致する 3 つのテーブルからすべてのレコードを削除する必要があります。

今、私は次の方法でそれを行います:

DECLARE
    CURSOR CUR IS 
        SELECT C.ID FROM A 
        INNER JOIN B ON A."ID" = B."ID" 
        INNER JOIN C ON B."ID" = C."ID"
        WHERE A.STATUS = 'ERROR';
    IDX NUMBER;
BEGIN
    FOR REC IN CUR LOOP 
        IDX := REC.ID;
        DELETE FROM C WHERE C."ID" = IDX;
        DELETE FROM B WHERE B."ID" = IDX;
        DELETE FROM A WHERE BP."ID" = IDX;
    END LOOP;
    COMMIT;
END;

大量のデータと非常に長い実行のためのこの方法。早く削除する方法はありますか?

4

1 に答える 1

3

ID を格納する PL/SQL タイプを作成できます。

CREATE TYPE t_ids AS TABLE OF NUMBER;

条件に一致するすべてのレコードをテーブルから削除しa、ID をその型の変数に返します。b次に、これらの ID から、およびこれらの ID を持つすべてのレコードを削除しますc

DECLARE
  ids_to_delete   t_ids;
BEGIN
  DELETE FROM a
   WHERE a.status = 'ERROR'
     AND EXISTS ( SELECT 1 FROM b WHERE b.id = a.id )
     AND EXISTS ( SELECT 1 FROM c WHERE c.id = a.id )
  RETURNING a.id
  BULK COLLECT INTO ids_to_delete;

  DELETE FROM b
   WHERE id IN ( SELECT COLUMN_VALUE FROM TABLE( ids_to_delete ) );

  DELETE FROM c
   WHERE id IN ( SELECT COLUMN_VALUE FROM TABLE( ids_to_delete ) );
END;

これは、ID ごとに 3 つのステートメントではなく、ループを必要とせず、3 つの SQL ステートメントですべてを実行するため、パフォーマンスが大幅に向上するはずです。

于 2012-10-30T09:10:34.323 に答える