Методы для удаления старых данных по базам данных Oracle

Я не смог найти работающее решение, которое не включало бы тестирование для i% 15 = 0 . Я всегда чувствовал, что не тестирование для этого является частью этого "глупого" задания. Имейте в виду, что это, вероятно, не идиоматический F #, так как это моя первая программа на языке.

for n in 1..100 do 
  let s = seq { 
    if n % 3 = 0 then yield "Fizz"
    if n % 5 = 0 then yield "Buzz" } 
  if Seq.isEmpty s then printf "%d"n
  printfn "%s"(s |> String.concat "")

6
задан Steve Broberg 11 June 2009 в 15:18
поделиться

4 ответа

По большей части я думаю, что вы застряли при удалении.

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

Возможно, даже в этом случае вы не сможете использовать операции разделов DDL удалить старые данные из-за проблем с ссылочной целостностью,

4
ответ дан 17 December 2019 в 07:08
поделиться

Удалить не так уж и плохо, при условии, что вы перестроите свои индексы . Oracle восстановит страницы, которые больше не содержат данных.

Однако, начиная с версии 8i (и вполне вероятно, до сих пор), он не мог должным образом восстанавливать страницы индекса, которые больше не содержали действительных ссылок. Хуже того, поскольку листы индекса были связаны цепочкой, вы могли попасть в ситуацию, когда он начал бы обход листовых узлов в поисках строки. Это привело бы к довольно значительному падению производительности: запросы, которые обычно занимали секунды, могли занимать минуты. Падение было также очень внезапным: сегодня все будет хорошо, завтра - нет.

Я обнаружил это поведение (для этого была ошибка Oracle, поэтому другие люди тоже) с приложением, которое использовало увеличение ключи и регулярно удаляемые данные.

0
ответ дан 17 December 2019 в 07:08
поделиться

What if you temporarily deactivate indexes, perform the deletes and then rebuild them? Would it improve the performance of your deletes? Of course, in this case you have to make sure the scripts are correct and ensure proper delete order and referential integrity.

0
ответ дан 17 December 2019 в 07:08
поделиться

У нас та же проблема, но мы используем ту же стратегию. Если ситуация становится действительно плохой (очень фрагментированное распределение индексов, таблиц и т. Д.), Мы пытаемся применить действия по освобождению пространства.

Таблицы должны разрешать перемещение строк (как в случае ретроспективного кадра): alter table TTT разрешить перемещение строк; переделать стол ТТТ термоусадочный; а затем перестроить все индексы.

Я не знаю, как у вас обстоят дела с окнами обслуживания, если приложение должно быть работоспособным все время, это сложнее, если нет, вы можете сделать некоторую «переупаковку», когда оно выключено -линия. "изменить таблицу TTT переместить табличное пространство SSSS" выполняет большую работу по устранению беспорядка при перезаписи таблицы. Вы также можете указать новые параметры хранения, такие как управление экстентами, размеры и т. Д., Посмотрите документацию.

Я использую такой сценарий для создания сценария для всей базы данных:

SET SQLPROMPT "-- "
SET ECHO OFF
SET NEWPAGE 0
SET SPACE 0
SET PAGESIZE 0
SET FEEDBACK OFF
SET HEADING OFF
SET TRIMSPOOL ON
SET TERMOUT OFF
SET VERIFY OFF
SET TAB OFF
spool doit.sql
select 'prompt Enabling row movement in '||table_name||'...'||CHR (10)||'alter table '||table_name||' enable row movement;' from user_tables where table_name not like '%$%' and table_name not like '%QTAB' and table_name not like 'SYS_%';
select 'prompt Setting initial ext for '||table_name||'...'||CHR (10)||'alter table '||table_name||' move storage (initial 1m);' from user_tables where table_name not like '%$%' and table_name not like '%QTAB' and table_name not like 'SYS_%';
select 'prompt Shrinking space for '||table_name||'...'||CHR (10)||'alter table '||table_name||' shrink space;' from user_tables where table_name not like '%$%' and table_name not like '%QTAB' and table_name not like 'SYS_%';
select 'prompt Rebuilding index '||index_name||'...'||CHR (10)||'alter index '||index_name||' rebuild;' from user_indexes where status = 'UNUSABLE';
spool off
prompt now check and then run @doit.sql
exit
0
ответ дан 17 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: