PostgreSQL 9.5.2 DELETE 永远占用

sal*_*ent 6 postgresql delete

我有一个看似简单的删除:

DELETE FROM table WHERE added_at < '2017-08-14'
Run Code Online (Sandbox Code Playgroud)

在具有 ~20k 行(w ~10k 受影响行)的表上,但它已经运行了 2000+ 秒。

SELECT * FROM table WHERE added_at < '2017-08-14'
Run Code Online (Sandbox Code Playgroud)

需要几毫秒。

我还有其他一些带有FOREIGN KEYs 的表,id并且我有一些以前的记录指向它,但是它们已经被删除了。

我试图:

Emi*_*zer 5

向依赖表添加索引(用于有效删除)

如果你有

create table "table"(
  id integer primary key,
  added_at date
);

create table other(
  other_id integer primary key,
  table_id integer,
  foreign key (table_id) references "table" (id)
);
Run Code Online (Sandbox Code Playgroud)

并且您从“表”中删除行 postgres 必须在另一个表中搜索您在“表”中删除的每一行。如果在其他表中添加索引 postgres 可以在索引中搜索。

CREATE INDEX ON other (table_id);
Run Code Online (Sandbox Code Playgroud)

现在您可以有效地删除“表”中的行。