Вы хотите удалить только одну учетную запись. Если бы в таблице было, скажем, только десять учетных записей, то полное сканирование таблицы было бы лучшим способом удалить этот большой процент данных таблицы. Но вы говорите, что удаление происходит намного быстрее, когда вы удаляете только учетные записи или дочерние учетные записи. Я понял, что время сложения двух удалений намного короче, чем у вашего комбинированного запроса. Очевидно, что тогда используется индекс, а это означает, что он должен быть только очень небольшим процентом удаляемой таблицы.
Две идеи:
- Ну, очевидно, вы можете просто запустить два оператора удаления вместо одного и достичь того, чего хотите.
- Четко показать СУБД, что из таблицы нужно удалить только одну учетную запись
INPUTFILELOG
(inputfilelog.account = ...
).
Таким образом:
delete from inputfilelog where account =
(select account from purge where account = ':NUMBER');
delete from inputfilelog where child_account =
(select account from purge where account = ':NUMBER');
Может быть, =
достаточно даже для быстрого выполнения комбинированного мета состояния (но использование двух индексов в сочетании с OR
обычно не так).
delete from inputfilelog
where account = (select account from purge where account = ':NUMBER')
or child_account = (select account from purge where account = ':NUMBER');
Другой подход с inputfilelog.account = ...
:
delete from inputfilelog
where (account = :NUMBER or child_account = :NUMBER)
and exists (select * from purge where account = :NUMBER);