Я использую psql 8.4.7. Я пытаюсь удалить из таблицы log с более чем 4 миллионами строк. Каждый раз, когда процесс начинается, он зависает, и я его останавливаю. Я попытался удалить 1 строку, используя идентификатор, чтобы выбрать его, но не повезло. Нет ошибки, просто зависает. У меня есть свободное место на моем диске. В таблице журналов есть дочерний стол с почти 2-мя рядами, а ON DELETE CASCADE - на месте. Другие таблицы с большим количеством иждивенцев и строки удалить просто отлично.Postgres зависает во время запроса на удаление
Вот создать заявление:
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);
Любая идея, что может быть не так?
EDIT: Определение таблицы для ребенка:
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).
У вашей таблицы 'child' есть индекс в столбце внешнего ключа? Это будет иметь решающее значение для производительности. Также: нам нужно полное определение таблицы «child». Триггеры - еще один подозреваемый. И Postgres 8.4 скоро достигнет EOL, подумайте над обновлением до текущей версии. В то время как вы застряли с 8.4, вам абсолютно необходимо обновить до последней версии, в настоящее время 8.4.18, а не 8.4.7] (http://www.postgresql.org/support/versioning/). С тех пор исправляются многие ошибки и исправления. Это может быть (частью) проблемы. –
Посмотрите на прогресс блокировки блокировки с помощью [ad hoc views] (http://wiki.postgresql.org/wiki/Lock_Monitoring) –
Извините, это комментарий отредактирован правильно;): @Erwin: Это клиентский сервер, поэтому сейчас обновление не является вариантом. Определение таблицы для ребенка: 'CREATE TABLE log_snapshot ( идентификатор последовательного NOT NULL, log_id целое, item_field характер изменения (255) DEFAULT NULL :: характер изменения, item_value характер изменения (255) DEFAULT NULL :: символ изменения, создал временная метка с часовым поясом по умолчанию в настоящее время(), модифицированная метки времени с часовым поясом по умолчанию в настоящее время(), CONSTRAINT fk_log_snapshot FOREIGN KEY (журнал) ЛИТЕРАТУРЫ() MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ) '. – fertech