Как оптимизацировать запрос на удаление записей из таблицы?

У меня есть самый обычный запрос на удаление (delete from table t where ...);

Как мне его оптимизировать , если в таблице оооочень много записей, и надо удалять порядка 200 тыс записей. в таблице содержится млн-ы записей. При удаление происходит еще удаление из зависимых таблиц ( у одной записи порядка 30 зависимых записей в разных таблицах).
explain analyze показывает
Delete on t  (cost=0.00..37370.84 rows=4758 width=6) (actual time=146.687..146.687 rows=0 loops=1)
  ->  Seq Scan on t(cost=0.00..37370.84 rows=4758 width=6) (actual time=146.682..146.682 rows=0 loops=1)
        Filter: (event_id = 437)
        Rows Removed by Filter: 1497652
Total runtime: 146.726 ms


в этом примере удаление примерно 3 тыс записей происходит
  • Вопрос задан
  • 407 просмотров
Пригласить эксперта
Ответы на вопрос 3
sim3x
@sim3x
Premature optimization
Ответ написан
Комментировать
@pihel
Sql, Oracle, pl/sql, BI, ETL, php, olap
Оптимизировать тут надо не запрос, а таблицу:
* отключать все индексы, чтобы они не перестраивались
* отключать FK, чтобы не было проверок целостности. (зависимости чистить вручную)
* Если записей милионы, то можно сделать партиции и чистить партиции ALTER TABLE t1 TRUNCATE PARTITION p0; (пимер из Oracle)
* Отключать все триггеры
и т.д. нужно ограничить влияние всех внешних факторов.
Ответ написан
Комментировать
alex1t
@alex1t
.net developer
Можно использовать подход "Soft Delete". Тогда будет простой update Table set IsDeleted = 1 where...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы