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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.07.2008, 13:21   #1  
Oleksandr is offline
Oleksandr
Участник
Аватар для Oleksandr
 
68 / 17 (1) ++
Регистрация: 19.03.2005
Адрес: Киев
delete_from performance
Всем привет.

Занимаюсь оптимизацией импорта большого колиства записей из внешней системы в АХ4.0.

Перед импортом нужно очистить таблицу.
Код:
    ForecastSales           sales;
    ;
    ttsbegin;
    sales.skipDeleteActions(true);
    sales.skipDeleteMethod(true);
    delete_from sales;
    ttscommit;
Что интресно - на 10000 записей удаление занимает около минуты, а на 100 000 - час. Реальный сценарий - до миллиона...

В чем причина такой нелинейости?

Спасибо.
П.С. direct SQL спасает, конечно.
__________________
--
regards, Oleksandr
Старый 02.07.2008, 13:25   #2  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Причина в том что SQL кэширует удаление\апдейт для возможности отката транзакции в случае ошибки, поэтому и наблюдается затухание скорости в геометрической прогрессии. , соответственно чем больше записей - тем больше тормоза.

Edit: Чтобы затухание не возникало, удаляйте записи по-одной в рамках транзакции ttsbegin\ttscommit.

Последний раз редактировалось DSPIC; 02.07.2008 в 13:29.
Старый 02.07.2008, 13:44   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Oleksandr Посмотреть сообщение
Перед импортом нужно очистить таблицу.
Иногда можно применить и Truncate.
X++:
new SqlDataDictionary().tableTruncate(tableNum(ForecastSales ));
Удаляет моментально. Правда из всех компаний.
В некоторых случаех это не важно.
Может это ваш случай.
За это сообщение автора поблагодарили: e@gle (2).
Старый 02.07.2008, 13:46   #4  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Причина в том что SQL кэширует удаление\апдейт для возможности отката транзакции в случае ошибки, поэтому и наблюдается затухание скорости в геометрической прогрессии. , соответственно чем больше записей - тем больше тормоза.

Edit: Чтобы затухание не возникало, удаляйте записи по-одной в рамках транзакции ttsbegin\ttscommit.
...или придумвйте критерий и удаляйте по частям, например по 10 000 записей.
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Старый 02.07.2008, 13:59   #5  
Didukh84 is offline
Didukh84
Участник
 
57 / 10 (1) +
Регистрация: 09.06.2006
Добрый день!
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Причина в том что SQL кэширует удаление\апдейт для возможности отката транзакции в случае ошибки, поэтому и наблюдается затухание скорости в геометрической прогрессии. , соответственно чем больше записей - тем больше тормоза.
Согласен. В принципе логично.
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Edit: Чтобы затухание не возникало, удаляйте записи по-одной в рамках транзакции ttsbegin\ttscommit.
Здесь мне кажеться лучше организовать цикл по удалению (но без ttsbegin\ttscommit!), a через delete_from. Что-то типа
X++:
int i = -1* maxuint();
while(i < maxuint())
{
   delete_from Table where Table.RecId<i;
    i = i + 10000;
}
По идее результат тот же, а выполнится быстрее.
__________________
Жить все веселей!.. AX3SP3CU1
Старый 02.07.2008, 14:05   #6  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от Oleksandr
...
В чем причина такой нелинейости?
...
Еще вариант — начинает банально не хватать памяти на сервере БД, что уменьшает долю закешированных данных от общего объема обрабатываемых, и приводит к росту ввода-вывода.

Там индексов 9 штук. От удаления по одной записи тоже чуда ожидать не стоит, мягко говоря.
__________________
С уважением,
glibs®
Старый 02.07.2008, 14:08   #7  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Только что проверил на таблице с 370 000 записей. delete_from - 367 секунд. while select forupdate - 472 секунды.
Старый 02.07.2008, 14:11   #8  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Edit: Чтобы затухание не возникало, удаляйте записи по-одной в рамках транзакции ttsbegin\ttscommit.
Цитата:
...или придумвйте критерий и удаляйте по частям, например по 10 000 записей.
Ну, примерно это я и имел ввиду. ;-) Понятно, что если миллион записей то по-одной удалять слишком дорого.
а:
X++:
new SqlDataDictionary().tableTruncate(tableNum(ForecastSales ));
вам не подходит? По-моему, выглядит привлекательней, причём для импорта из других систем использование вполне обосновано, если компании не используются.
Старый 02.07.2008, 14:15   #9  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Всем ПРВТ!
Я только на секундочку.., хочу bbcode посмотреть как реализовывать) А где ещё тестить ббкоде как на не любомом некогда форуме?
Чтобы зазря буквы не тратить..
X++:
    skipTTScheck(1); //отключит транзакции и удалит пулей (ttsbegin/commit - надо будет стереть)
    skipDataBaseLog(1); //отключит лог
и вот ещё
X++:
    tableTruncate// удаляет ссылку на данные(мгновенно), восстановить нельзя будет даже через бэкап
вроде работает)
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
За это сообщение автора поблагодарили: Qaz Qwerty (1).
Старый 02.07.2008, 14:16   #10  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
От удаления по одной записи тоже чуда ожидать не стоит, мягко говоря.
Вопрос был больше о причине нелинейности. Если > миллиона записей, то удаление сразу всех записей вообще может не произойти, вывалясь например на ошибку о нехватке памяти, что не произойдет в случае удаления по-одной(или серии) записей.
Цитата:
олько что проверил на таблице с 370 000 записей. delete_from - 367 секунд. while select forupdate - 472 секунды.
Нужно больше рекорд чтобы увидеть эффект затухания
Старый 02.07.2008, 14:21   #11  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
2 Mazy (или кто сейчас у руля?)
тег code - не закрыт у тебя, из-за этого используется не моноширинный шрифт и исходники X++ - разъезжаются.
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 02.07.2008, 15:04   #12  
Oleksandr is offline
Oleksandr
Участник
Аватар для Oleksandr
 
68 / 17 (1) ++
Регистрация: 19.03.2005
Адрес: Киев
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Только что проверил на таблице с 370 000 записей. delete_from - 367 секунд. while select forupdate - 472 секунды.
Ошибочка в код закралась - забыл-таки поставить параметр (true) в skipdeletActions(), skipdeleteMethos().

Теперь все чики-пики, несколько секунд.

Хотя вопрос все-равно интересный - о нелинейности, даже с исполнением триггеров и делит - экшинов.

Спасибо за ответы.
__________________
--
regards, Oleksandr
Старый 02.07.2008, 15:06   #13  
Oleksandr is offline
Oleksandr
Участник
Аватар для Oleksandr
 
68 / 17 (1) ++
Регистрация: 19.03.2005
Адрес: Киев
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Ну, примерно это я и имел ввиду. ;-) Понятно, что если миллион записей то по-одной удалять слишком дорого.
а:
X++:
new SqlDataDictionary().tableTruncate(tableNum(ForecastSales ));
вам не подходит? По-моему, выглядит привлекательней, причём для импорта из других систем использование вполне обосновано, если компании не используются.
Мне нужно из одной комании, забыл уточнить. А транкейт - хорошая весч, как гильотина от насморка
__________________
--
regards, Oleksandr
Теги
ax4.0, delete_from, truncate, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: SQL Sever 2008 - Performance with Dynamics AX 2009 - Resource Governor Blog bot DAX Blogs 0 23.01.2009 22:05
axStart: Why performance issues hits you’re AX implementation 3 months after going live. Blog bot DAX Blogs 0 05.03.2008 05:47
Dynamics AX: Dynamics AX project success - Performance Tuning the system Blog bot DAX Blogs 0 09.08.2007 22:53
Dynamics AX: Performance Load Testing for Dynamics AX [Soon!] Blog bot DAX Blogs 0 19.03.2007 08:05
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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