文件头是在omdok表:如何加快删除文档,而行
create table omdok (dokumnr serial primary key, ...);
文件排在omrid表
CREATE TABLE omrid
(
id serial NOT NULL,
reanr serial NOT NULL,
dokumnr integer NOT NULL,
CONSTRAINT omrid_pkey PRIMARY KEY (id),
CONSTRAINT omrid_dokumnr_fkey FOREIGN KEY (dokumnr)
REFERENCES omdok (dokumnr) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE,
....
);
记录omdok不具有在omrid需求的子行要删除
我试图
delete from omdok where dokumnr not in (select dokumnr from omrid)
查询它目前正在运行15小时,并且仍在运行。 postgres.exe始终使用50%的CPU(这是2个核心CPU)。
explain delete from omdok where dokumnr not in (select dokumnr from omrid)
回报:
"Delete (cost=0.00..21971079433.34 rows=220815 width=6)"
" -> Seq Scan on omdok (cost=0.00..21971079433.34 rows=220815 width=6)"
" Filter: (NOT (SubPlan 1))"
" SubPlan 1"
" -> Materialize (cost=0.00..94756.92 rows=1897261 width=4)"
" -> Seq Scan on omrid (cost=0.00..77858.61 rows=1897261 width=4)"
- 如何删除家长没有子行快?
- 此命令是否完成或postgres挂?
- 目前运行15小时。完成需要多少小时? 如何加快此查询?
使用
PostgreSQL 9.0.1, compiled by Visual C++ build 1500, 64-bit
Windows 2003 x64 server with 4 GB RAM.
psql-genral邮件列表建议用'从omdok删除不存在的地方(从omrid选择1,其中omdok.dokumnr = omrid.dokumnr);' – Andrus
@安德鲁斯。 。 。我更喜欢“不存在”,但我认为这个指数适用于任何一种公式。 –