![]() |
#1 |
Участник
|
delete_from
Добрый день
Сталкивался ли кто-нибудь со следующей проблемой в delete_from: Если на таблицу, по которой делается delete_from, навешан delete action, то не выполняется операция delete на СУБД, а выполняется select и потом delete по одной строке (точь в точь как описано в DevGuide в случае переопределенного метода delete() на таблице) Можно ли как-нибудь обойти эту проблему или шансов нет? База Oracle Заранее спасибо. |
|
![]() |
#2 |
Злыдни
|
skipDeleteActions(), по-моему...
|
|
![]() |
#3 |
Участник
|
Но сделать, чтобы delete actions также отработали, и запрос выполнился как delete, шансов нет?
Т.е. делаем вывод, что delete actions не задаются на уровне СУБД, а остаются на уровне приложения? |
|
![]() |
#4 |
Участник
|
да.
|
|
![]() |
#5 |
Участник
|
Цитата:
Изначально опубликовано mazzy
да. |
|
![]() |
#6 |
Участник
|
А в чем проблема - вы хотите чтобы DeleteActions вообще не отрабатывали или хотите
чтобы отрабатывали но как-то быстрее ? |
|
![]() |
#7 |
Участник
|
Да, хотелось бы быстрее.
Наверняка cascade на СУБД выполняется быстрее, чем select/delete по одной записи в приложении. |
|
![]() |
#8 |
Модератор
|
Хм. Только триггер на таблице в базе...
Но это не есть хорошо... ![]() В частности, Ваш приемние может так и никогда и не узнать о подобной "барабашке" С Уважением, Георгий. |
|
![]() |
#9 |
Участник
|
Цитата:
Изначально опубликовано George Nordic
Хм. Только триггер на таблице в базе... Но это не есть хорошо... ![]() В частности, Ваш приемние может так и никогда и не узнать о подобной "барабашке" С Уважением, Георгий. Сталкивался стакой проблемой, которую так и не смог ни преодолеть, ни объяснить вразумительно. Если время исполнеия тригера СУБД значительно, то аксапта считает что операция не смогла успешно закончиться и откатывает транзакцию... при этом в интерфейсе фиксируется нормально завершенная операция. Хотя при рефреше интерфейса, все возвращается на круги своя... Предположили, что проблема впланировщике, который определяет некий тайминг для исполнения, и когда его ожидания не оправдываются, он констатирует откат транзакции... Возможно что и не так... Так что решайте все проблемы средствами аксапты... целее будете.. |
|
![]() |
#10 |
Участник
|
Цитата:
Изначально опубликовано simply2double
Не советую так поступать... в случае с аксаптой номера с тригерами СУБД не прокатывают. Сталкивался стакой проблемой, которую так и не смог ни преодолеть, ни объяснить вразумительно. Если время исполнеия тригера СУБД значительно, то аксапта считает что операция не смогла успешно закончиться и откатывает транзакцию... при этом в интерфейсе фиксируется нормально завершенная операция. Хотя при рефреше интерфейса, все возвращается на круги своя... Предположили, что проблема впланировщике, который определяет некий тайминг для исполнения, и когда его ожидания не оправдываются, он констатирует откат транзакции... Возможно что и не так... Так что решайте все проблемы средствами аксапты... целее будете.. |
|
![]() |
#11 |
Модератор
|
PHP код:
|
|
![]() |
#12 |
Участник
|
exists join существенно медленнее inner, посмотрите на трассировку запросов
- там на сервер посылается подзапрос where exists (то есть тот же select). |
|
![]() |
#13 |
Модератор
|
Цитата:
Изначально опубликовано Nikolaich
exists join существенно медленнее inner, посмотрите на трассировку запросов - там на сервер посылается подзапрос where exists (то есть тот же select). Я тут примерчик набросал. Посмотрите плана исполнения. Убедитесь, что наличие WHERE EXISTS() в запросе совсем не означает обязательного его (подзапроса) исполнения для каждой удаляемой строки. Люди, которые сиквелу оптимизатор пишут, тоже незря хлеб едят PHP код:
|
|
![]() |
#14 |
Участник
|
Цитата:
Изначально опубликовано Vadik
PHP код:
|
|
![]() |
#15 |
Модератор
|
Цитата:
Изначально опубликовано chel
Выполнение такого запроса скатывается в full scan по detailTable, хотя индекс по внешнему ключу есть. Есть подозрение, что это происходит в результате большого количества удаляемых записей. - если просто удаляется единичная запись из masterTable, можно упростить до delete_from detailTable where detailTable.Key = masterTable.Key и сравнить планы - наконец, можно "вправить мозг" оптимизатору хинтом Жаль, что не работает PHP код:
![]() |
|
![]() |
#16 |
Участник
|
Цитата:
Изначально опубликовано Vadik
Скорее всего. Так получается, если затрагивается более 5 - 10 (цифра приблизительная) процентов записей. - если просто удаляется единичная запись из masterTable, можно упростить до delete_from detailTable where detailTable.Key = masterTable.Key и сравнить планы - наконец, можно "вправить мозг" оптимизатору хинтом Жаль, что не работает PHP код:
![]() ![]() Большое спасибо за советы. |
|