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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.04.2010, 16:59   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
Переделал на удаление через delete_from по частям (по 100000 записей)
Удаление 600000 записей - 1 час, удаление 1200000 записей - 2 часа
Удаление 600000 записей напрямую в SQL Server Management Studio - 16 минут.
Собственно, почему я не хотел использовать delete_from, надеялся, что будет работать быстрее, но, похоже, не судьба...
Такая разница во времени означает прежде всего, что в Аксапте операция удаления выполняет больше действий, чем в SQL Server Management Studio.

В Аксапте отрабатывается каскадное удаление (или запрет удаления) и так далее.
Вам Shirmin Oleg, неоднокрартно говорилось, а вы не слушаете. Что delete_from работает с точно такой же скоростью, что и команда из SQL Server Management Studio, если не нужно выполнять дополнительных действий и проверок.

Почитайте наконец http://msdn.microsoft.com/en-us/library/aa849875.aspx

И вместо того, чтобы "надеятся", просто разберитесь со своими настройками в Аксапте. Уберите лишние действия/настройки. И будет вам такая же скорость.

Если же некоторые настройки лишними не являются, то своей суперскоростной командой из SQL Server Management Studio вы просто нарушаете целостность данных.
__________________
полезное на axForum, github, vk, coub.
Старый 23.04.2010, 18:00   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
Переделал на удаление через delete_from по частям (по 100000 записей)
Каким образом реализовали удаление по частям? Индекс соответствующий условию выборки присутствует? Если не по частям а за один раз, то так же долго?
Старый 23.04.2010, 23:42   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
кроме того, первоначальный запрос
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
X++:
  sql = strfmt("delete from SALESTABLE_TONTRA40478 where SALESTABLE_TONTRA40478.month = '%1'", date2str(01\03\2010, 321, 2, 3, 2, 3, 4));
по-моему, удаляет данные изо всех компаний.
а delete_from только из текущей.

вы можете по человечески описать что делаете, с какими условиями, какие настройки, какие запросы уходят у вас на SQL в результате команды delete_from и т.п.
__________________
полезное на axForum, github, vk, coub.
Старый 23.04.2010, 17:12   #4  
Shirmin Oleg is offline
Shirmin Oleg
Участник
 
89 / 35 (2) +++
Регистрация: 26.03.2004
Delete actions на данной таблице нет, метод delete не перекрыт, перед удалением есть след код:
X++:
          table.skipDatabaseLog(true);
          table.skipDeleteActions(true);
          table.skipDeleteMethod(true);
Хотя это в данном случае излишне.

Уважаемый Mazzy, подскажите, пожалуйста, с какими еще настройками я "должен разобраться"?
Старый 23.04.2010, 18:12   #5  
Shirmin Oleg is offline
Shirmin Oleg
Участник
 
89 / 35 (2) +++
Регистрация: 26.03.2004
Цитата:
Каким образом реализовали удаление по частям?
В цикле проверяю наличие записей за нужный период, находу самый младший recid, запускаю delete_from с ограничением по периоду и от младшего recid, до += размер удаляемого блока записей (recid идут подряд, т.к. таблица заполняется в один прием), после этого опять проверяю наличие записей в таблице

Цитата:
Индекс соответствующий условию выборки присутствует?
Есть индекс по recid и (неуникальный) по периоду

Цитата:
Если не по частям а за один раз, то так же долго?
Если за один раз, то еще дольше (примерно раза в два)
Старый 23.04.2010, 19:23   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Попробуйте посмотреть какой SQL запрос уходит в БД

И ещё пальцем в небо. RLS на удаляемой таблице не настроено?
Старый 23.04.2010, 23:33   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
Delete actions на данной таблице нет, метод delete не перекрыт, перед удалением есть след код:
X++:
          table.skipDatabaseLog(true);
          table.skipDeleteActions(true);
          table.skipDeleteMethod(true);
Хотя это в данном случае излишне.

Уважаемый Mazzy, подскажите, пожалуйста, с какими еще настройками я "должен разобраться"?
таблица в map'ах присутствует?
таблица во view перечислена?
таблица входит в виртуальные компании?

вообще говоря, это офигенно странный способ задавать вопросы: типа, перчислите все что у меня может быть.

Блин, расскажите по-человечески что вы там делаете.
То, что вы делаете skip перед удалением вообще только сейчас всплыло.
Разбирайтесь.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
И ещё пальцем в небо. RLS на удаляемой таблице не настроено?
и это проверьте.

Барабашки нет!
Посмотрите какие запросы уходят из Аксапты в вашем случае.
Разберитесь почему так и из-за каких настроек.

ЕЩЕ РАЗ: вам было истинно сказано в самом начале:
Цитата:
Сообщение от lev Посмотреть сообщение
delete_from должно удалить данные одним запросом к базе, т.е. делает тоже самое, что Вы делает через CCADOConnection.
просто вы слушать не хотите.
__________________
полезное на axForum, github, vk, coub.
Старый 27.04.2010, 11:10   #8  
Shirmin Oleg is offline
Shirmin Oleg
Участник
 
89 / 35 (2) +++
Регистрация: 26.03.2004
Цитата:
RLS на удаляемой таблице не настроено?
Нет, не настроено.
Таблицы в map'ах нет, во view тоже не используется, в вирт. комп. не входит

X++:
  table.skipDatabaseLog(true);
  table.skipDeleteActions(true);
  table.skipDeleteMethod(true);

  delete_from table where table.Month == _month;
После того, как отрабатывает удаление (delete_from), в лог все равно происходит вставка:

Трассировка SQL
X++:
DELETE FROM SALESTABLE_TELECOMPHONTRA40478 WHERE ((DATAAREAID=?) AND (MONTH=?))

INSERT INTO SYSDATABASELOG (DATA,USERNAME,DESCRIPTION,LOGTYPE,TABLE_,LOGRECID,CREATEDBY,CREATEDTRANSACTIONID,DATAAREAID,RECVERSION,RECID) VALUES (?,?,?,?,?,?,?,?,?,?,?);SELECT CREATEDDATETIME FROM SYSDATABASELOG WHERE RECID = ? AND DATAAREAID = ?
Естественно, при удалении через SQL Management этой вставки нет.
Старый 27.04.2010, 11:36   #9  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
Нет, не настроено.
Таблицы в map'ах нет, во view тоже не используется, в вирт. комп. не входит

X++:
  table.skipDatabaseLog(true);
...
После того, как отрабатывает удаление (delete_from), в лог все равно происходит вставка...
Очень странно... skipDatabaseLog(true) вызывается именно для того что бы исключить эту вставку... У меня Ахарта 3.0 SP3, и лог таким способом нормально отключается. Возможно это уже новшества в 4.0 и 2009, или что - то где то допилено, что бы эта вставка была в любом случае.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 27.04.2010, 12:13   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
После того, как отрабатывает удаление (delete_from), в лог все равно происходит вставка:
А в лог заносится запись именно об удалении строки из SALESTABLE_TELECOMPHONTRA40478?
Чему равны поля LOGTYPE и TABLE_?
Старый 27.04.2010, 12:43   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение

После того, как отрабатывает удаление (delete_from), в лог все равно происходит вставка:
Вы можете по-человечески и полностью показать код?
__________________
полезное на axForum, github, vk, coub.
Старый 27.04.2010, 16:07   #12  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
После того, как отрабатывает удаление (delete_from), в лог все равно происходит вставка
Знаю, что дурацкий вопрос, но все же: зачем на таблице из которой надо периодически удалять 600000 записей (а я так понимаю, что перед тем как что-то удалить, это что-то надо туда сначала записать), настраивать Database log ?
__________________
-ТСЯ или -ТЬСЯ ?
Старый 27.04.2010, 11:27   #13  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
А тормоза при удалении или при вставке?

С Уважением,
Георгий
Старый 27.04.2010, 12:08   #14  
Shirmin Oleg is offline
Shirmin Oleg
Участник
 
89 / 35 (2) +++
Регистрация: 26.03.2004
Трассировку проверял в 2009, никаких допиливаний для того, чтобы в SysDataBaseLog вставка была в любом случае нет.
Старый 27.04.2010, 14:20   #15  
Shirmin Oleg is offline
Shirmin Oleg
Участник
 
89 / 35 (2) +++
Регистрация: 26.03.2004
Цитата:
А в лог заносится запись именно об удалении строки из SALESTABLE_TELECOMPHONTRA40478?
Чему равны поля LOGTYPE и TABLE_?
В 4.0 в лог вообще ничего не пишется.
В 2009 в лог пишется после каждой отработки delete_from (один раз на один удаляемый блок). LogType = Delete, Table - 40478 (ид. SALESTABLE_TELECOMPHONTRA40478) Так что запись в лог не тормозит, тормозит сам delete_from.

X++:
  SALESTABLE_TELECOMPHONTRA40478 table;      
  int64                                    firstRecid, lastRecid;
  int                                      count2Del = 100000;
  ;
  select count(recid) from table where table.Month == _month;
  if(table.RecId > count2Del)
        {
          while (true)
            {
              if((select firstOnly TELECOMPHONTRA40478 where              TELECOMPHONTRA40478.month == _month).recid != 0)
                {
                  select minof(recid) from table where table.Month == _month;
                  firstRecid = table.RecId;
                  lastRecid = firstRecid + count2Del;
                  select maxof(recid) from table where table.month == _month;
                  if(table.RecId < lastRecid)
                    lastRecid = table.RecId;

                  table.skipDatabaseLog(true);
                  table.skipDeleteActions(true);
                  table.skipDeleteMethod(true);

                  delete_from table where table.Month == _month && table.RecId >= firstRecid && table.RecId <= lastRecid;
                }
              else
                break;
            }
        }
      else
        {
          table.skipDatabaseLog(true);
          table.skipDeleteActions(true);
          table.skipDeleteMethod(true);

          delete_from table where table.Month == _month;
        }
Старый 27.04.2010, 14:48   #16  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А сколько времени удаляются из AX 600000 записей (не по частям) ?
X++:
table.skipDatabaseLog(true);
delete_from table where table.Month == _month;
__________________
Sergey Nefedov
Старый 27.04.2010, 15:14   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от SRF Посмотреть сообщение
А сколько времени удаляются из AX 600000 записей (не по частям) ?
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
Если за один раз, то еще дольше (примерно раза в два)
.
Старый 27.04.2010, 15:11   #18  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А если ради эксперимента отключить через Администрирование логирование удалений в этой таблице?

P.S. Mazzy, а вы говорили, что у меня код сложный
Массовое удаление записей через CCADOConnection
Старый 27.04.2010, 15:52   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
Так что запись в лог не тормозит, тормозит сам delete_from.
Да что ж за человек то, а?

А что пишется в лог?
Туда пишется информация об одной записи или о всех удаленных?
Напомню, что в databaselog информация об изменениях находится в blob-поле в виде контейнера.
__________________
полезное на axForum, github, vk, coub.
Старый 27.04.2010, 16:04   #20  
Shirmin Oleg is offline
Shirmin Oleg
Участник
 
89 / 35 (2) +++
Регистрация: 26.03.2004
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А если ради эксперимента отключить через Администрирование логирование удалений в этой таблице?
У нас эта таблица не включена в логирование именно потому, что там много данных и они могут периодически заменяться. Логирование не тормозит, в моем случае запись в лог происходит всего 6 раз за всю процедуру удаления, тормозит сама обработка delete_from (100000 записей - примерно 10 минут)
Теги
ax2009, ccadoconnection, delete_from, оптимизация, удаление

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Задвоение RecId при вставке записей через COM коннектор db DAX: Программирование 1 23.04.2009 15:12
Класс OfficialsServ_RU - удаление записей из OfficialsTrans_RU Logger DAX: Программирование 3 14.09.2006 15:58
Запуск программы из Аксапты через 2-хзвенку Migel_84 DAX: Программирование 25 27.04.2006 09:41
Проблема с запуском business connector'a через удал доступ yooshi DAX: Программирование 1 07.11.2005 08:56
Удаление записей из InventDim и SalesTable DreamCreator DAX: Программирование 4 08.12.2004 17:23

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:34.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.