0

私は休止状態でpostgresを使用しており、2つのSQLテーブルがあります。「TABLE_2」は「TABLE_1」と多対一の関係にあります。

CREATE TABLE "TABLE_1"
(
  "ID" bigint NOT NULL,
  "VALUE" bigint NOT NULL,
  CONSTRAINT "PK_TABLE_1 " PRIMARY KEY ("ID" ),
)

CREATE TABLE "TABLE_2"
(
  "ID" bigint NOT NULL,
  "TABLE_1_ID" bigint,
  CONSTRAINT "PK_TABLE_2" PRIMARY KEY ("ID" ),
  CONSTRAINT "FK_TABLE_2-TABLE_1" FOREIGN KEY ("TABLE_1_ID")
      REFERENCES "TABLE_1" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE ????????
)

テーブル 2 には、テーブル 1 のエントリに依存する多数 (数百万) のエントリが存在する場合があります。テーブル 1 のエントリを削除すると、テーブル 2 のすべての依存エントリも削除する必要があります。(メモリ不足例外なし)

それを行うための2つの可能な解決策があります。

  1. テーブル 2 で「ON DELETE CASCADE」を使用します。

  2. カスケードされたエントリを削除するビジネス ロジックを実装する

バツ

while (true) {
    recTable2 = table2Dao.findForTable1(table1, 100);
    if (( recTable2 != null) && (recTable2 .size() > 0)) {
       for (Table2 Table2entry : recTable2) {
            table2Dao.remove(Table2entry);
        }
    } else {
        break;
    }
}

メモリ不足の例外を回避するために、1 ステップで 100 エントリのみが削除されます

ここで私の質問:

  • 「ON DELETE CASCADE」でソリューション 1 を使用すると、削除するデータが大量にある場合はどうなりますか? 私はメモリ不足の例外を取得しますか、それとも postgres はこれを「自動的に」処理しますか?

  • ビジネス ロジックでソリューション 2 を使用すると、パフォーマンスが非常に低下します。多くのテーブル エントリを削除するより良い方法はありますか??

  • カスケード テーブル エントリを削除するには、一般的にどちらの方法を使用しますか? ビジネスロジックで行うか、それとも「ON DELETE CASCADE」で行うか?

4

2 に答える 2

4

大量のエンティティを削除する場合、どちらが優れているか (「ビジネス ロジックで行うか、「ON DELETE CASCADE」で行うか)」という質問に答えるために、いくつかのテスト アプリケーションを作成しました。

最初のアプリケーションは、1 つの TABLE_1 エントリと 100'000 の TABLE_2 エンティティを格納します。すべての TABLE_2 エンティティには、「TABLE_1_ID」エンティティの FOREIGN KEY があります。

次に、すべてのエントリを削除する 2 つのアプリケーションを作成しました。

アプリケーション 1: (ビジネス ロジック アプローチ)

最初に、「ON DELETE CASCADE」関係を使用せずに、大きな for ループですべての TABLE_2 エンティティをロードして削除します。次に、TABLE_1 のエントリを削除します。

→ このアプリケーションには 32 秒と約 600MB のヒープメモリが必要です

アプリケーション 2: (「ON DELETE CASCADE」アプローチ)

「ON DELETE CASCADE」を使用して、TABLE_1 のエントリを直接削除します (TABLE_2 のすべてのエントリが自動的に削除されます)。

→ このアプリケーションには 0.067 秒と約 50MB のヒープメモリが必要です

したがって、この小さなテストの後、「ON DELETE CASCADE」アプローチの方が何倍も優れていると思います (500 倍速く、12 分の 1 のメモリしか必要としません)。

于 2013-11-18T10:51:37.620 に答える
0

2 番目のテーブルに数百万のレコードを含める場合は、外部キー列のインデックスを作成することをお勧めします。削除時間に大きな違いが生じます。

于 2013-11-15T13:33:25.457 に答える