23.04.2010, 13:36 | #21 |
Модератор
|
Да просто давныыым-давно сталкивался именно с подобной проблемой. Например, при сводном планировании нужны InventSumLogTTS (много времени прошло, могу не помнить точно), а после - ну что с ними далать? а они расползались...
Короче, подобным способом и решили проблему. Или периодическую очистку делали? С Уважением, Георгий |
|
23.04.2010, 14:13 | #22 |
Administrator
|
Цитата:
Тут другая ситуация. Грузят данные. Они актуальны (например данные с магазинов). Потом (например, в течении дня) присылают откорректированные данные (кто-то ошибся). Старые данные еще не обрабатывали (они автоматически закачались, но их обработка будет к примеру на след. день). Соотв - старые данные нужно стереть, а новые закачать. Я с подобной потребностью сталкивался при импорте строк выписки. Сотрудник заказывает предварительную (по операциям текущего дня) выписку и получает ее (включая автозагрузку в АХ). Банк кстати вполне может пойти навстречу по такой услуге, особенно если это свой банк . Затем (на след. день) выписка приходит уже окончательная. Соотв - предварительная выписка в АХ не обрабатывается в тот же день. Куда деть предварительную выписку? Стереть. А теперь считаем, что фирма (холдинг) у нас состоит не из одного юрлица и не одного расчетного счета... Да и операций у нас много.... В общем - объемно получается
__________________
Возможно сделать все. Вопрос времени |
|
23.04.2010, 14:41 | #23 |
Модератор
|
Да подожди ты таблицы резать
Надо сначала найти источник проблемы. 1. Понять какие данные нужны. 2. Когда они устаревают. 3. На что эти данные влияют? Не пригодяться ли удаленные данные впоследствии? Связи. 4. Можно ли это решить настройками. Или, например переносить в другой журнал и удалять. 5. Если нельзя программно, то сколько времени займет доработка. 6. Можно ли запускать данную процедуру на периодической основе. А программистам сразу бы drop table Георгий |
|
23.04.2010, 16:46 | #24 |
Участник
|
Переделал на удаление через delete_from по частям (по 100000 записей)
Удаление 600000 записей - 1 час, удаление 1200000 записей - 2 часа Удаление 600000 записей напрямую в SQL Server Management Studio - 16 минут. Собственно, почему я не хотел использовать delete_from, надеялся, что будет работать быстрее, но, похоже, не судьба... |
|
23.04.2010, 16:59 | #25 |
Участник
|
Цитата:
Сообщение от Shirmin Oleg
Переделал на удаление через delete_from по частям (по 100000 записей)
Удаление 600000 записей - 1 час, удаление 1200000 записей - 2 часа Удаление 600000 записей напрямую в SQL Server Management Studio - 16 минут. Собственно, почему я не хотел использовать delete_from, надеялся, что будет работать быстрее, но, похоже, не судьба... В Аксапте отрабатывается каскадное удаление (или запрет удаления) и так далее. Вам Shirmin Oleg, неоднокрартно говорилось, а вы не слушаете. Что delete_from работает с точно такой же скоростью, что и команда из SQL Server Management Studio, если не нужно выполнять дополнительных действий и проверок. Почитайте наконец http://msdn.microsoft.com/en-us/library/aa849875.aspx И вместо того, чтобы "надеятся", просто разберитесь со своими настройками в Аксапте. Уберите лишние действия/настройки. И будет вам такая же скорость. Если же некоторые настройки лишними не являются, то своей суперскоростной командой из SQL Server Management Studio вы просто нарушаете целостность данных. |
|
23.04.2010, 17:12 | #26 |
Участник
|
Delete actions на данной таблице нет, метод delete не перекрыт, перед удалением есть след код:
X++: table.skipDatabaseLog(true); table.skipDeleteActions(true); table.skipDeleteMethod(true); Уважаемый Mazzy, подскажите, пожалуйста, с какими еще настройками я "должен разобраться"? |
|
23.04.2010, 18:00 | #27 |
Участник
|
|
|
23.04.2010, 18:12 | #28 |
Участник
|
Цитата:
Каким образом реализовали удаление по частям?
Цитата:
Индекс соответствующий условию выборки присутствует?
Цитата:
Если не по частям а за один раз, то так же долго?
|
|
23.04.2010, 19:23 | #29 |
Участник
|
Попробуйте посмотреть какой SQL запрос уходит в БД
И ещё пальцем в небо. RLS на удаляемой таблице не настроено? |
|
23.04.2010, 23:33 | #30 |
Участник
|
Цитата:
Сообщение от Shirmin Oleg
Delete actions на данной таблице нет, метод delete не перекрыт, перед удалением есть след код:
X++: table.skipDatabaseLog(true); table.skipDeleteActions(true); table.skipDeleteMethod(true); Уважаемый Mazzy, подскажите, пожалуйста, с какими еще настройками я "должен разобраться"? таблица во view перечислена? таблица входит в виртуальные компании? вообще говоря, это офигенно странный способ задавать вопросы: типа, перчислите все что у меня может быть. Блин, расскажите по-человечески что вы там делаете. То, что вы делаете skip перед удалением вообще только сейчас всплыло. Разбирайтесь. Цитата:
Сообщение от mazzy
Почитайте наконец http://msdn.microsoft.com/en-us/library/aa849875.aspx
Барабашки нет! Посмотрите какие запросы уходят из Аксапты в вашем случае. Разберитесь почему так и из-за каких настроек. ЕЩЕ РАЗ: вам было истинно сказано в самом начале: просто вы слушать не хотите. |
|
23.04.2010, 23:42 | #31 |
Участник
|
кроме того, первоначальный запрос
Цитата:
а delete_from только из текущей. вы можете по человечески описать что делаете, с какими условиями, какие настройки, какие запросы уходят у вас на SQL в результате команды delete_from и т.п. |
|
27.04.2010, 11:10 | #32 |
Участник
|
Цитата:
RLS на удаляемой таблице не настроено?
Таблицы в map'ах нет, во view тоже не используется, в вирт. комп. не входит X++: table.skipDatabaseLog(true); table.skipDeleteActions(true); table.skipDeleteMethod(true); delete_from table where table.Month == _month; Трассировка 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 = ? |
|
27.04.2010, 11:27 | #33 |
Модератор
|
А тормоза при удалении или при вставке?
С Уважением, Георгий |
|
27.04.2010, 11:36 | #34 |
Ищущий знания...
|
Очень странно... skipDatabaseLog(true) вызывается именно для того что бы исключить эту вставку... У меня Ахарта 3.0 SP3, и лог таким способом нормально отключается. Возможно это уже новшества в 4.0 и 2009, или что - то где то допилено, что бы эта вставка была в любом случае.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
27.04.2010, 12:08 | #35 |
Участник
|
Трассировку проверял в 2009, никаких допиливаний для того, чтобы в SysDataBaseLog вставка была в любом случае нет.
|
|
27.04.2010, 12:13 | #36 |
Участник
|
|
|
27.04.2010, 12:43 | #37 |
Участник
|
Вы можете по-человечески и полностью показать код?
|
|
27.04.2010, 14:20 | #38 |
Участник
|
Цитата:
А в лог заносится запись именно об удалении строки из SALESTABLE_TELECOMPHONTRA40478?
Чему равны поля LOGTYPE и TABLE_? В 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 | #39 |
Участник
|
А сколько времени удаляются из AX 600000 записей (не по частям) ?
X++: table.skipDatabaseLog(true); delete_from table where table.Month == _month;
__________________
Sergey Nefedov |
|
27.04.2010, 15:11 | #40 |
Участник
|
А если ради эксперимента отключить через Администрирование логирование удалений в этой таблице?
P.S. Mazzy, а вы говорили, что у меня код сложный Массовое удаление записей через CCADOConnection |
|
Теги |
ax2009, ccadoconnection, delete_from, оптимизация, удаление |
|
|