我必须从包含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万个数据。
答案 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)
您能否尝试合并临时表的条件并使用其中的删除部分。那应该会给你一个很好的表现