|  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 код: 
			   . Ладно, пока придется оставить как есть. Большое спасибо за советы. | 
|  |