AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.02.2005, 15:23   #1  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
delete_from
Добрый день

Сталкивался ли кто-нибудь со следующей проблемой в delete_from:

Если на таблицу, по которой делается delete_from, навешан delete action, то не выполняется операция delete на СУБД, а выполняется select и потом delete по одной строке (точь в точь как описано в DevGuide в случае переопределенного метода delete() на таблице)

Можно ли как-нибудь обойти эту проблему или шансов нет?

База Oracle

Заранее спасибо.
Старый 02.02.2005, 15:28   #2  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
skipDeleteActions(), по-моему...
Старый 02.02.2005, 15:34   #3  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Но сделать, чтобы delete actions также отработали, и запрос выполнился как delete, шансов нет?

Т.е. делаем вывод, что delete actions не задаются на уровне СУБД, а остаются на уровне приложения?
Старый 02.02.2005, 15:53   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
да.
Старый 02.02.2005, 15:55   #5  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Изначально опубликовано mazzy
да.
Спасибо. Буду думать, как ускорить...
Старый 03.02.2005, 09:31   #6  
Nikolaich is offline
Nikolaich
Участник
 
238 / 10 (1) +
Регистрация: 15.12.2004
А в чем проблема - вы хотите чтобы DeleteActions вообще не отрабатывали или хотите
чтобы отрабатывали но как-то быстрее ?
Старый 03.02.2005, 10:52   #7  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Да, хотелось бы быстрее.
Наверняка cascade на СУБД выполняется быстрее, чем select/delete по одной записи в приложении.
Старый 03.02.2005, 11:08   #8  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хм. Только триггер на таблице в базе...

Но это не есть хорошо...
В частности, Ваш приемние может так и никогда и не узнать о подобной "барабашке"

С Уважением,
Георгий.
Старый 03.02.2005, 11:22   #9  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано George Nordic
Хм. Только триггер на таблице в базе...

Но это не есть хорошо...
В частности, Ваш приемние может так и никогда и не узнать о подобной "барабашке"

С Уважением,
Георгий.
Не советую так поступать... в случае с аксаптой номера с тригерами СУБД не прокатывают.
Сталкивался стакой проблемой, которую так и не смог ни преодолеть, ни объяснить вразумительно. Если время исполнеия тригера СУБД значительно, то аксапта считает что операция не смогла успешно закончиться и откатывает транзакцию... при этом в интерфейсе фиксируется нормально завершенная операция. Хотя при рефреше интерфейса, все возвращается на круги своя...
Предположили, что проблема впланировщике, который определяет некий тайминг для исполнения, и когда его ожидания не оправдываются, он констатирует откат транзакции... Возможно что и не так...
Так что решайте все проблемы средствами аксапты... целее будете..
Старый 03.02.2005, 12:09   #10  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Изначально опубликовано simply2double


Не советую так поступать... в случае с аксаптой номера с тригерами СУБД не прокатывают.
Сталкивался стакой проблемой, которую так и не смог ни преодолеть, ни объяснить вразумительно. Если время исполнеия тригера СУБД значительно, то аксапта считает что операция не смогла успешно закончиться и откатывает транзакцию... при этом в интерфейсе фиксируется нормально завершенная операция. Хотя при рефреше интерфейса, все возвращается на круги своя...
Предположили, что проблема впланировщике, который определяет некий тайминг для исполнения, и когда его ожидания не оправдываются, он констатирует откат транзакции... Возможно что и не так...
Так что решайте все проблемы средствами аксапты... целее будете..
Ценная информация, спасибо. Хотя я вроде и не собирался решать проблему вне системы. Думал над отключением relation'a и его ручным эмулированием (благо операция удаления может выполняться только в очень небольшом количестве мест)
Старый 03.02.2005, 16:24   #11  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
PHP код:
ttsbegin;

delete_from detailTable 
exists join masterTable where masterTable
...;

delete_from  masterTable;

ttscommit
DeleteActions все равно отработают, но физическое удаление из DetailTable пройдет за одну операцию
Старый 03.02.2005, 17:29   #12  
Nikolaich is offline
Nikolaich
Участник
 
238 / 10 (1) +
Регистрация: 15.12.2004
exists join существенно медленнее inner, посмотрите на трассировку запросов
- там на сервер посылается подзапрос where exists (то есть тот же select).
Старый 03.02.2005, 19:02   #13  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано Nikolaich
exists join существенно медленнее inner, посмотрите на трассировку запросов
- там на сервер посылается подзапрос where exists (то есть тот же select).
В трассировку смотрел. Насчет "существенно" несогласен

Я тут примерчик набросал. Посмотрите плана исполнения. Убедитесь, что наличие WHERE EXISTS() в запросе совсем не означает обязательного его (подзапроса) исполнения для каждой удаляемой строки. Люди, которые сиквелу оптимизатор пишут, тоже незря хлеб едят

PHP код:
set showplan_all on
go

begin tran

delete trans
from bmssa
.LedgerTrans trans
inner join bmssa
.LedgerTable ledger on ledger.AccountNum trans.AccountNum 
where ledger
.dataareaid 'dmo' and trans.DataAreaId 'dmo' and ledger.AccountNum '    01.000'

rollback
go

begin tran

delete trans
from bmssa
.LedgerTrans trans
where trans
.DataAreaId 'dmo' and exists
    
(select 
    
from bmssa.LedgerTable ledger 
    where 
        ledger
.DataAreaid 'dmo' and 
        
ledger.AccountNum trans.AccountNum and
        
ledger.AccountNum '    01.000')

rollback tran
go 
Старый 04.02.2005, 10:22   #14  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Изначально опубликовано Vadik
PHP код:
ttsbegin;

delete_from detailTable 
exists join masterTable where masterTable
...;

delete_from  masterTable;

ttscommit
DeleteActions все равно отработают, но физическое удаление из DetailTable пройдет за одну операцию
Да, решение конечно элегантное, но рождает какие-то странные проблемы. Выполнение такого запроса скатывается в full scan по detailTable, хотя индекс по внешнему ключу есть. Есть подозрение, что это происходит в результате большого количества удаляемых записей.
Старый 04.02.2005, 13:21   #15  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано chel
Выполнение такого запроса скатывается в full scan по detailTable, хотя индекс по внешнему ключу есть. Есть подозрение, что это происходит в результате большого количества удаляемых записей.
Скорее всего. Так получается, если затрагивается более 5 - 10 (цифра приблизительная) процентов записей.

- если просто удаляется единичная запись из masterTable, можно упростить до delete_from detailTable where detailTable.Key = masterTable.Key и сравнить планы
- наконец, можно "вправить мозг" оптимизатору хинтом

Жаль, что не работает
PHP код:
delete_from detailTable
join masterTable 
Старый 04.02.2005, 17:09   #16  
chel is offline
chel
Участник
 
153 / 10 (1) +
Регистрация: 02.09.2003
Цитата:
Изначально опубликовано Vadik


Скорее всего. Так получается, если затрагивается более 5 - 10 (цифра приблизительная) процентов записей.

- если просто удаляется единичная запись из masterTable, можно упростить до delete_from detailTable where detailTable.Key = masterTable.Key и сравнить планы
- наконец, можно "вправить мозг" оптимизатору хинтом

Жаль, что не работает
PHP код:
delete_from detailTable
join masterTable 
К сожалению, удаление именно большого количества строк - порядка тысяч. А код delete...join... - просто мечта . Ладно, пока придется оставить как есть.
Большое спасибо за советы.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:41.