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