2010-02-02 1 views
1

У меня есть таблица, которая 5 Гб, теперь я пытался удалить, как показано ниже:Как удалить большие данные из Oracle 9i DB?

delete from tablename 
where to_char(screatetime,'yyyy-mm-dd') <'2009-06-01' 

Но он работает долго и нет ответа. В то же время я попытался проверить, если кто-то блокирует с этим ниже:

select l1.sid, ' IS BLOCKING ', l2.sid 
from v$lock l1, v$lock l2 
where l1.block =1 and l2.request > 0 
and l1.id1=l2.id1 
and l1.id2=l2.id2 

Но я не нашел каких-либо блокировки также.

Как удалить эти большие данные без каких-либо проблем?

ответ

1

5GB не является полезным измерением размера стола. Общее количество строк имеет значение. Количество строк, которые вы собираетесь удалить, в процентах от общего количества вопросов. Средняя длина строки имеет значение.

Если пропорция строк, подлежащих удалению, является крошечной, возможно, стоит создать индекс на screatetime, который вы потом снимете. Это может означать, что вся ваша операция занимает больше времени, но, самое главное, это сократит время, необходимое для удаления строк.

С другой стороны, если вы удаляете большой кусок строк вы могли бы найти лучше

  1. Создать копию таблицы с помощью «создать таблицу t1_copy, как выбрать * от t1 где screatedate > = to_date ('2009-06-01', 'yyyy-mm-dd') `
  2. Поменяйте местами таблицы командой rename.
  3. Ограничения повторного применения, индексы к новому T1.

Другая вещь, которую следует иметь в виду, заключается в том, что делеции едят больше UNDO, чем другие транзакции, потому что они берут больше информации для отката. Поэтому, если ваши записи длинны и/или многочисленны, то вашему администратору базы данных может потребоваться проверить табличное пространство UNDO (или отменить сегменты, если вы все еще используете их).

Наконец, вы провели какое-либо расследование, чтобы узнать, где на самом деле происходит время? Операторы DELETE - это всего лишь еще один запрос, и их можно решить с помощью обычной настройки трюков.

+0

Дорогой APC благодарит вас очень много. Я думаю, что это я ищу. Я работаю и возвращаюсь. – Joseph

1
  • Используйте запрос condition to export необходимые строки
  • усечение таблицы
  • Импорт строк
+0

Спасибо. у меня есть вопрос. ему нужен экспорт? Это нормально, если я вставляю необходимые данные во временную таблицу и усекаю и вставляю обратно в исходную таблицу? если я пойду с этим путем, есть ли проблема? – Joseph

1

Если есть индекс по screatetime вашего запроса не может использовать его. Измените свой оператор так, чтобы предложение where могло использовать индекс.

delete from tablename where screatetime < to_date('2009-06-01','yyyy-mm-dd') 
+0

спасибо. но нет индекса на этом – Joseph

+0

, если записи, которые вы пытаетесь удалить, являются лишь малой частью общего индекса, который может быть полезен. Если вы удалите большую часть таблицы, запрос, возможно, выполнит полное сканирование таблицы и не будет использовать индекс. Другие вещи, которые могут замедлить его: триггеры. Включены ли какие-либо триггеры при удалении. внешних ключей. Вы можете удалить больше, чем просто из этой таблицы, если существуют каскадные внешние ключи. – Rene

+0

Спасибо, Рене. Проверка с проверкой Оцените свою обратную связь – Joseph

1

Он работает гораздо быстрее, когда вы блокируете таблицу первой. Также измените предложение where, как предложил Рене.

LOCK TABLE tablename IN EXCLUSIVE MODE; 

DELETE FROM tablename 
where screatetime < to_date('2009-06-01','yyyy-mm-dd'); 

EDIT: Если таблица не может быть заблокирован, так как он постоянно доступен, вы можете выбрать салями тактику, чтобы удалить эти строки:

BEGIN 
    LOOP 
    DELETE FROM tablename 
     WHERE screatetime < to_date('2009-06-01','yyyy-mm-dd') 
     AND ROWNUM<=10000; 
    EXIT WHEN SQL%ROWCOUNT=0; 
    COMMIT; 
    END LOOP; 
END; 

В целом, это будет медленнее, но он не будет вырывают сегмент отката, и вы можете видеть прогресс в другом сеансе (т. е. количество строк в tablename уменьшается). И если вам по какой-то причине нужно убить, откат не займет много времени, и вы не потеряли всю работу, проделанную до сих пор.

+0

Уважаемый Ammo благодарит за ваши фиды. если я заблокирую таблицу, тогда никто не сможет получить право? Это живая таблица. – Joseph

+1

Если вы заблокируете ее, никто не сможет написать (INSERT, UPDATE, DELETE) в эту таблицу. Если это проблема, вы можете выбрать тактику салями. –

 Смежные вопросы

  • Нет связанных вопросов^_^