Я делаю эту простую транзакцию:
DELETE FROM ominve01
WHERE CVE_OBS IN (SELECT CVE_OBS
FROM minve01 M
WHERE M.FECHA_DOCU < '31.12.2010'
OR FECHA_DOCU > '31.12.2015')
- minve01 имеет 189 тыс. строк
- ominve01 имеет 86 тыс. строк
Но полное удаление занимает около 2 1/2 часов. Мой запрос плохой? как я могу улучшить его?
или как я могу увеличить скорость транзакции?
- ominve01.cve_obs — ПК
- minve01.cve_obs не pk
SELECT
для самостоятельной работы? Если эта часть занимает много времени, рассмотрите возможность индекса наminve01.FECHA_DOCU
(я бы предложил кластерный индекс, но кажется, что Firebird их не поддерживает). Я не думаю, что индексominve01.CVE_OBS
сильно поможет, но вы все равно можете попробовать, чтобы увидеть. Другая вещь, которую я мог бы придумать, это полностью изменить структуру инструкции, чтобы она не использовалаWHERE column IN (subselect)
, но я недостаточно знаю синтаксис Firebird, чтобы что-то предложить. - person Turophile   schedule 07.04.2015EXISTS
вместоIN
; обычно работает лучше - person Mark Rotteveel   schedule 07.04.2015