|
23.04.2010, 16:59 | #1 |
Участник
|
Цитата:
Сообщение от 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, 18:00 | #2 |
Участник
|
|
|
23.04.2010, 23:42 | #3 |
Участник
|
кроме того, первоначальный запрос
Цитата:
а delete_from только из текущей. вы можете по человечески описать что делаете, с какими условиями, какие настройки, какие запросы уходят у вас на SQL в результате команды delete_from и т.п. |
|
23.04.2010, 17:12 | #4 |
Участник
|
Delete actions на данной таблице нет, метод delete не перекрыт, перед удалением есть след код:
X++: table.skipDatabaseLog(true); table.skipDeleteActions(true); table.skipDeleteMethod(true); Уважаемый Mazzy, подскажите, пожалуйста, с какими еще настройками я "должен разобраться"? |
|
23.04.2010, 18:12 | #5 |
Участник
|
Цитата:
Каким образом реализовали удаление по частям?
Цитата:
Индекс соответствующий условию выборки присутствует?
Цитата:
Если не по частям а за один раз, то так же долго?
|
|
23.04.2010, 19:23 | #6 |
Участник
|
Попробуйте посмотреть какой SQL запрос уходит в БД
И ещё пальцем в небо. RLS на удаляемой таблице не настроено? |
|
23.04.2010, 23:33 | #7 |
Участник
|
Цитата:
Сообщение от 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
Барабашки нет! Посмотрите какие запросы уходят из Аксапты в вашем случае. Разберитесь почему так и из-за каких настроек. ЕЩЕ РАЗ: вам было истинно сказано в самом начале: просто вы слушать не хотите. |
|
27.04.2010, 11:10 | #8 |
Участник
|
Цитата:
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:36 | #9 |
Ищущий знания...
|
Очень странно... skipDatabaseLog(true) вызывается именно для того что бы исключить эту вставку... У меня Ахарта 3.0 SP3, и лог таким способом нормально отключается. Возможно это уже новшества в 4.0 и 2009, или что - то где то допилено, что бы эта вставка была в любом случае.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
27.04.2010, 12:13 | #10 |
Участник
|
|
|
27.04.2010, 12:43 | #11 |
Участник
|
Вы можете по-человечески и полностью показать код?
|
|
27.04.2010, 16:07 | #12 |
Модератор
|
Знаю, что дурацкий вопрос, но все же: зачем на таблице из которой надо периодически удалять 600000 записей (а я так понимаю, что перед тем как что-то удалить, это что-то надо туда сначала записать), настраивать Database log ?
__________________
-ТСЯ или -ТЬСЯ ? |
|
27.04.2010, 11:27 | #13 |
Модератор
|
А тормоза при удалении или при вставке?
С Уважением, Георгий |
|
27.04.2010, 12:08 | #14 |
Участник
|
Трассировку проверял в 2009, никаких допиливаний для того, чтобы в SysDataBaseLog вставка была в любом случае нет.
|
|
27.04.2010, 14:20 | #15 |
Участник
|
Цитата:
А в лог заносится запись именно об удалении строки из 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 | #16 |
Участник
|
А сколько времени удаляются из AX 600000 записей (не по частям) ?
X++: table.skipDatabaseLog(true); delete_from table where table.Month == _month;
__________________
Sergey Nefedov |
|
27.04.2010, 15:14 | #17 |
Участник
|
|
|
27.04.2010, 15:11 | #18 |
Участник
|
А если ради эксперимента отключить через Администрирование логирование удалений в этой таблице?
P.S. Mazzy, а вы говорили, что у меня код сложный Массовое удаление записей через CCADOConnection |
|
27.04.2010, 15:52 | #19 |
Участник
|
Да что ж за человек то, а?
А что пишется в лог? Туда пишется информация об одной записи или о всех удаленных? Напомню, что в databaselog информация об изменениях находится в blob-поле в виде контейнера. |
|
27.04.2010, 16:04 | #20 |
Участник
|
У нас эта таблица не включена в логирование именно потому, что там много данных и они могут периодически заменяться. Логирование не тормозит, в моем случае запись в лог происходит всего 6 раз за всю процедуру удаления, тормозит сама обработка delete_from (100000 записей - примерно 10 минут)
|
|
Теги |
ax2009, ccadoconnection, delete_from, оптимизация, удаление |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|