在postgresql中删除数百万条记录

时间:2016-04-14 06:47:00

标签: sql sql-delete postgresql-9.1 bulk

我必须从包含120万条记录的表中删除行。 不应删除具有最高(entry_date)和第二高(entry_date)的数据。

表有许多限制。 一个主要的关键 两个外键 主键上的索引以外的两个索引。

我已经成功尝试删除方法,因为创建临时表并将所需数据移动到临时表中。 然后删除当前表,然后再次将过滤后的数据从temp移回主表。它工作正常。 但我需要一种删除记录的方法。

CREATE TABLE values
(
  value_id bigint NOT NULL,
  content_definition_id bigint NOT NULL,
  value_s text,
  value_n double precision,
  order integer,
  scope_id integer NOT NULL,
  answer boolean NOT NULL,
  date timestamp without time zone NOT NULL,
  entry_date timestamp without time zone NOT NULL,
  CONSTRAINT "value_PK" PRIMARY KEY (value_id),
  CONSTRAINT content_definition_id_fk FOREIGN KEY (content_definition_id)
      REFERENCES content_definition (content_definition_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT scope_fk FOREIGN KEY (scope_id)
      REFERENCES scopes (scope_id) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT
)
-- Index: fki_content_definition_id_fk
-- Index: fki_value_value_scope_id

如何删除记录,首先只删除100万个数据。

2 个答案:

答案 0 :(得分:0)

这假设您没有冲突的锁。请注意,索引页锁定也可能会降低速度。

最近的PostgreSQL允许您在删除语句中使用CTE。即你可以:

WITH ids_to_delete (
    SELECT value_id FROM values
    where ...
    limit ...
)
delete from values where value_id in (select value_id from ids_to_delete)

答案 1 :(得分:0)

您能否尝试合并临时表的条件并使用其中的删除部分。那应该会给你一个很好的表现