Firebird удаляет очень медленно

Я делаю эту простую транзакцию:

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

person Chico3001    schedule 07.04.2015    source источник
comment
Сколько времени требуется SELECT для самостоятельной работы? Если эта часть занимает много времени, рассмотрите возможность индекса на minve01.FECHA_DOCU (я бы предложил кластерный индекс, но кажется, что Firebird их не поддерживает). Я не думаю, что индекс ominve01.CVE_OBS сильно поможет, но вы все равно можете попробовать, чтобы увидеть. Другая вещь, которую я мог бы придумать, это полностью изменить структуру инструкции, чтобы она не использовала WHERE column IN (subselect), но я недостаточно знаю синтаксис Firebird, чтобы что-то предложить.   -  person Turophile    schedule 07.04.2015
comment
Вы указали мне правильное направление... я добавил индекс в minve01.cve_obs, и удаление заняло всего 980 мс... Спасибо!!!   -  person Chico3001    schedule 07.04.2015
comment
Вы также можете рассмотреть возможность использования EXISTS вместо IN; обычно работает лучше   -  person Mark Rotteveel    schedule 07.04.2015


Ответы (1)


DELETE FROM ominve01 N 
WHERE 
exists(SELECT * FROM minve01 M 
       WHERE M.FECHA_DOCU < '31.12.2010' 
       OR FECHA_DOCU > '31.12.2015' and
N.CVE_OBS=M.CVE_OBS)

или выполнить блок (вам нужно исправить тип переменной)

execute block
as
declare variable v integer;
begin
for SELECT M.CVE_OBS 
                  FROM minve01 M 
                  WHERE M.FECHA_DOCU < '31.12.2010' 
                  OR FECHA_DOCU > '31.12.2015'
into :v do delete from ominve01 WHERE CVE_OBS=:v;
end
person rstrelba    schedule 07.04.2015
comment
Решение EXISTS также очень медленное. Вы пытались удалить с помощью хранимой процедуры, как говорит rstrelba? - person Jose Ramon Garcia; 18.11.2015