|
![]() |
#1 |
Administrator
|
Цитата:
Сообщение от Shirmin Oleg
![]() От безысходности параметр выставлял аж в значение 1000000, визуально вообще ничего не изменилось (падало за то же время, что и без него)
... Отказаться, к сожалению, невозможно, надо удалять. ... Удаляемая часть данных - малая толика от всей таблицы, боюсь в данном случае времени на перекачку данных в новую таблицу уйдет еще больше, чем при удалении через delete_from Т.е. написать что-то типа этого: X++: Counter i; ; ttsbegin; while select forupdate mytable { mytable.dodelete(); i++; if (i > 10000) // Число подобрать надо { break; } } ttscommit;
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#2 |
Участник
|
И даже тогда можно не отказываться от преимуществ конструкции delete_from. 'Порционного' удаления можно добиться при помощи фильтрации.
X++: SALESTABLE_TONTRA40478 Table; date month = 01\03\2010; RecId minRecId, maxRecId, fromRecId, toRecId; int partSize = 10000 // Число подобрать надо; select minof(RecId) from Table where Table.month == month; fromRecId = Table.RecId; select maxof(RecId) from Table where Table.month == month; toRecId = Table.RecId; for(fromRecId = minRecId; fromRecId <= maxRecId; fromRecId += partSize) { toRecId = fromRecId + partSize; Table.skipDatabaseLog(true); Table.skipDeleteActions(true); Table.skipDeleteMethod(true) delete_from Table where Table.month == month && Table.RecId >= fromRecId && Table.RecId <= toRecId; } |
|
![]() |
#3 |
Участник
|
Сложно то как
![]() Да. Но брать порциями по PartSize - бесполезно. В интервале может быть и 10тыс записей, и ни одной. Достаточно просто сузить диапазон. А главное - обрамить tts-скобками ![]() X++: SALESTABLE_TONTRA40478 Table; date month; while(true) { select minof(month),minof(recid) from Table; if( !Table.recid ) break; month = Table.month; ttsbegin; Table.skipDatabaseLog(true); Table.skipDeleteActions(true); Table.skipDeleteMethod(true) delete_from Table where Table.month == month; ttscommit; } |
|
![]() |
#4 |
Участник
|
Зато универсально. Таким способом можно удалить любую другую выборку.
Цитата:
На сколько я понял условие задачи. Удаляють нужно не все записи из таблицы, а только за определённый месяц. Причём даже за один месяц число записей > 600 000; Зачем? Или это шутка юмора такая? ![]() |
|
![]() |
#5 |
Участник
|
Цитата:
Но может быть просто поискать другое поле? Которое и с индексом, и дает относительно небольшое число записей? Например, не месяц, а дату. Нет. Если база установлена в Recovery Model = Full, то разницы действительно не будет. Если же база установлена в Recovery Model = Simple, то после окончания каждой транзакции transaction log будет очищаться. вполне возможно, что у автора transaction log сильно растет, а на диске места свободного мало. Вот и мучается SQL, затрачивая каждый раз много времени на увеличение transaction log. |
|
![]() |
#6 |
Участник
|
Цитата:
И да, естественно, включать индекс по RecId будет необходимо. Это понятно, я просто рассчитывал, что конструкция delete_from cамостоятельно открывает и закрывает транзакцию. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#7 |
Участник
|
Э-э-э... По-моему, нет. Хотя могу ошибаться.
|
|
![]() |
#8 |
Administrator
|
Цитата:
Конечно брать тупо по 10 (20,30) тыс. записей - тоже не вариант - объем записей бывает разный. В общем - надо искать "золотую" середину.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#9 |
Участник
|
Цитата:
причем в сообщении автора условие по этом полю и было. вполне возможно, что проблема с отсутствии индекса и в Full Table Scan. |
|
Теги |
ax2009, ccadoconnection, delete_from, оптимизация, удаление |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|