Postgres在删除查询期间挂起

时间:2013-11-18 20:23:56

标签: postgresql triggers hang delete-row postgresql-8.4

我正在使用psql 8.4.7。我试图从超过400万行的 log 表中删除。每次进程开始时,它都会挂起并停止它。 我尝试删除1行,使用id来选择它,但没有运气。没有错误,只是挂起。 我的磁盘上有可用空间。日志表有一个包含近2行的子表,并且已有ON DELETE CASCADE。 其他表具有更多的依赖和行删除就好了。

这是create语句:

  CREATE TABLE log(
  id serial NOT NULL,
  userid integer,
  itemid integer NOT NULL,
  itemtype integer NOT NULL,
  date timestamp with time zone NOT NULL DEFAULT now(),
  actiontype integer NOT NULL,
  log_detail text,
  dtype integer,
  created timestamp with time zone DEFAULT now(),
  modified timestamp with time zone DEFAULT now(),
  CONSTRAINT log_pkey PRIMARY KEY (id),
  CONSTRAINT fk_log_user_id FOREIGN KEY (userid)
  REFERENCES appuser (id) MATCH SIMPLE
  ON UPDATE CASCADE ON DELETE SET NULL
)
CREATE INDEX log_itemid_index
 ON log
 USING btree
 (itemid);

CREATE INDEX log_itemtype_index
  ON log
  USING btree
  (itemtype);

CREATE INDEX log_userid_index
  ON log
  USING btree
  (userid);

知道可能出现什么问题吗?

编辑: 孩子的表定义是:

CREATE TABLE log_snapshot ( 
id serial NOT NULL, 
log_id integer, 
item_field character varying(255) DEFAULT NULL::character varying, 
item_value character varying(255) DEFAULT NULL::character varying, 
created timestamp with time zone DEFAULT now(),
modified timestamp with time zone DEFAULT now(), 
CONSTRAINT fk_log_snapshot FOREIGN KEY () REFERENCES log () MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ).

2 个答案:

答案 0 :(得分:1)

其他人已经提到了。但是尝试创建一个索引 log_snapshot(LOG_ID) 我试过了(在日志和log_snapshot中插入了10000000条记录)。查看执行时间差异。

test=# delete from log where id = 196;
DELETE 1
Time: 1232.772 ms
test=# create index myindex on log_snapshot(log_id);
CREATE INDEX
Time: 10143.934 ms
test=# delete from log where id = 496;
DELETE 1
Time: 65.293 ms

答案 1 :(得分:0)

我遇到了类似的问题,后来发现我的本地机器上的服务器已经打开,我的桌子可能会被锁定。我停止服务器时问题已解决。