У меня есть существенная база данных... не очень большая - всего около 1 ГБ данных.
Мне нужно удалить некоторые строки из нескольких таблиц. Например, у меня есть таблица
Order
id | ... | status | ...
1 | ... | 1 | ...
...
40 | ... | 20 | ...
41 | ... | 1 | ...
...
470000 | ... | 12 | ...
Теперь я хочу удалить все заказы, которые имеют status=1
Я предполагаю, что делаю это с помощью:
УДАЛИТЬ ИЗ Заказа, ГДЕ статус=1
Все красиво и просто казалось бы, но на это уходят годы! Когда я запустил этот запрос, он все еще работал со 100% загрузкой ЦП через 40 минут... когда я убил процесс, ничего не было удалено.
Когда я попытался ограничить область действия с помощью
УДАЛИТЬ ИЗ Заказа, ГДЕ статус=1 И идентификатор‹1000
потребовалось пару минут, чтобы удалить около 200 строк....
Есть ли что-то, чего мне не хватает в моей конфигурации? Что я должен искать/проверить/изменить? Любые идеи, почему это так чертовски неэффективно?
Позвольте мне добавить, что я обычно работаю с MySQL и мне нужно управлять этой базой данных postgres, но на самом деле у меня нет никакого опыта работы с postgres, поэтому это может быть что-то очень простое.
Индексы есть как в столбцах id, так и в столбцах состояния.
В таблице около 500 тыс. строк, около половины необходимо удалить.
План выполнения:
Delete (cost=0.00..19474.19 rows=266518 width=6)
-> Seq Scan on Orders (cost=0.00..19474.19 rows=266518 width=6)
Filter: (statusid = 1)
Нет никаких триггеров или правил любого рода. Более того, я не добавил, что это свежая копия таблицы, я имею в виду, что она была перемещена с другого сервера с помощью экспорта/импорта. Может быть, это как-то играет роль?
Поможет ли удаление индексов?
status
? Как выглядит план выполнения оператора удаления? - person a_horse_with_no_name   schedule 24.10.2011FOREIGN KEY
, который ссылается на эту таблицу и имеет определенное действиеON DELETE
. - person ypercubeᵀᴹ   schedule 24.10.2011