0

我将 postgres 与休眠一起使用,并且我有两个 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 中的所有依赖条目也应该被删除。(没有内存不足异常)

我看到了两种可能的解决方案。

  1. 在我的表 2 中使用“ON DELETE CASCADE”。

  2. 实现一些业务逻辑来删除级联的条目

X

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

为避免内存不足异常,仅一步删除 100 个条目

这是我的问题:

  • 当我将解决方案 1 与“ON DELETE CASCADE”一起使用时,如果要删除大量数据会怎样?我是否会出现内存不足异常或 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。

然后我写了两个应用程序来删除所有条目:

应用一:(业务逻辑方式)

首先在大 for 循环中加载和删除所有 TABLE_2 实体,而不使用“ON DELETE CASCADE”关系。然后删除 TABLE_1 中的条目。

→ 这个应用程序需要 32 秒和大约 600MB 的堆内存

应用2:( “ON DELETE CASCADE”方法)

使用“ON DELETE CASCADE”直接删除TABLE_1中的条目(TABLE_2中的所有条目将被自动删除)

→ 这个应用程序需要 0.067 秒和大约 50MB 的堆内存

所以,经过这个小测试后,我认为“ON DELETE CASCADE”方法要好很多倍。(快 500 倍,需要的内存减少 12 倍)

于 2013-11-18T10:51:37.620 回答
0

如果您要在第二个表中拥有数百万条记录,最好索引外键列。这将在删除时间上有很大的不同。

于 2013-11-15T13:33:25.457 回答