|
30.07.2009, 12:32 | #1 |
Участник
|
Truncate части таблицы
Коллеги подскажите, возможно средствами оракла грохнуть быстро часть таблицы ?
Стоит задача почистить salesDataBaseLog. Самый просто вариант это сделать truncate - но нужно часть записей (10% объема сохранить) DELETE_from - не подходит, так как сильно напрягается движок БД. Возможен некий гибрид этих операций ? Чтобы удалить только часть таблицы, но так же ненапряжно для БД как при truncate ? |
|
30.07.2009, 12:43 | #2 |
Участник
|
скопировать нужную часть в другую таблицу, старую инфу грохнуть, а потом перелить нужную ;-)
|
|
|
За это сообщение автора поблагодарили: Logger (1). |
30.07.2009, 15:01 | #3 |
MCITP
|
Цитата:
А вообще это стандарт для таких ситуаций, лучше не придумаете, тем более что тут нет констрэинтов: - CTAS (Create Table As Select) нужной части данных - Drop <table> - Rename <inter_table> to <table> - Create <нужные индексы> - в случае Аксапты - синхронизация Что приятно, в отличие от удаления ещё и "соптимизируется" занимаемое таблицей и её индексами место...
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Logger (3). |
30.07.2009, 12:47 | #4 |
Участник
|
Да, рабочий способ. Спасибо.
Но так влом заниматься переливом, созданием, удалением, переименованием. Попроще есть что-нибудь ? |
|
30.07.2009, 12:54 | #5 |
Участник
|
|
|
30.07.2009, 13:15 | #6 |
Боец
|
Если не уходить в Оракл, не пробовали ли вы попробовать отключить:
X++: SalesTable salesTable; ; salesTable.skipDatabaseLog(false); salesTable.skipAosValidation(false); salesTable.skipDataMethods(false); salesTable.skipDeleteActions(false); salesTable.skipDeleteMethod(false); salesTable.skipEvents(false); delete_from salesTable; |
|
30.07.2009, 13:49 | #7 |
Участник
|
Цитата:
Сообщение от DSPIC
Если не уходить в Оракл, не пробовали ли вы попробовать отключить:
X++: SalesTable salesTable; ; salesTable.skipDatabaseLog(false); salesTable.skipAosValidation(false); salesTable.skipDataMethods(false); salesTable.skipDeleteActions(false); salesTable.skipDeleteMethod(false); salesTable.skipEvents(false); delete_from salesTable; |
|
30.07.2009, 13:21 | #8 |
----------------
|
Медленно и печально, но совершенно незаметно для окружающих, если есть индекс по RecId
X++: SELECT TOP 1 * FROM SysDatabaseLog (NOLOCK) WHERE CreatedDate < DATEADD(m, -1, GETDATE()); GO WHILE @@ROWCOUNT > 0 BEGIN DELETE FROM SysDatabaseLog WHERE RecId IN (SELECT TOP 1000 RecId FROM SysDatabaseLog (NOLOCK) WHERE CreatedDate < DATEADD(m, -1, GETDATE()) ); END GO Последний раз редактировалось Wamr; 30.07.2009 в 13:23. |
|
Теги |
oracle, как правильно, truncate, удаление |
|
|