Как удалить большой объем данных в SQL Server без потери данных? - PullRequest
2 голосов
/ 25 апреля 2019

Я имел дело с миллионами удаления данных в повседневной работе.

В основном у меня есть 4 таблицы.

Table_A
Table_B
Table_C
Table_D

Я пытаюсь удалить данные старше 10дней во всех таблицах.

Возможно, я буду удалять около миллиона в каждой таблице.Я создал хранимую процедуру для выполнения этих операций.

Для удаления данных я выполнил следующие шаги:

Шаг 1. Переместите последние дни (данные, которые я должен сохранить) ввременная таблица

select * into Table_A_Temp
from Table_A
where <<where clause last 10 days to till date>>

Шаг 2: переименование основной таблицы в старую таблицу (таблица со всеми данными дней)

exec sp_rename 'Table_A', 'Table_A_Old'

Шаг 3: переименование временной таблицы в основную таблицу (таблица с данными междупоследние дни до даты)

exec sp_rename 'Table_A_temp', 'Table_A'

Шаг 4: Запрос временной таблицы с временными рамками, если какие-либо новые данные вставляются в процессе копирования

Insert into Table_A
select * from Table_A_old

Шаг 5: Удаление старых таблиц

DROP TABLE Table_A_old

Шаг 6: Создание ключей и ограничений в основной таблице (означает переименованную таблицу)

code to create primary keys and constraints

Проблема:

Если я постоянновставляя данные в таблицу во время выполнения хранимой процедуры, я теряю данные на несколько секунд.

Случай 1: при переименовании таблицы

, когда я переименовываю основную в старую и временную таблицу вmain

Я получаю недопустимую ошибку объекта (эта таблица существует с ошибкой)

Случай 2: две из моих таблиц имеют отношение внешнего ключа

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

Как обрабатывать и удалятьданные без потери данных.

Пожалуйста, советуйте лучшие практики.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Предположительно, это постоянная потребность.

Что вам нужно сделать, это разделить таблицы.Чтобы узнать о разбиении в документации .

Вероятно, самый простой способ заключается в следующем:

  • Скопируйте каждую таблицу в новое место.
  • Переопределите каждую таблицу и добавьте функцию разделения.
  • Загрузите данные обратно в таблицы.

Для третьего шага просто загрузите самые последние данные, которыевы хотите.

Затем, в будущем, вы можете просто удалить самый старый раздел каждый день.Для этого можно настроить задание агента SQL Server, и система будет работать автоматически.

1 голос
/ 25 апреля 2019

Чтобы не потерять данные, я бы просто удалил записи там, где они есть, в отличие от создания / переименования таблиц.SQL Server будет обрабатывать вставки и удаления для вас, чтобы предотвратить потерю данных.Есть несколько способов сделать это, ниже приведено одно предложение.

Шаг 1: Получите Id / Identifiers строк, которые вы хотите удалить , и сохраните их во временной таблице.

SELECT Id 
INTO #TEMP_Table_A_RowsToDelete
FROM Table_A
WHERE <<your_date_column <= 10 days ago>>

После этого у вас будет временная таблица #TEMP_Table_A_RowsToDelete, содержащая Id значения строк, которые вы собираетесь удалить.

Шаг 2 ( необязательно ): Используйте эту таблицу для удаления любых связанных данных в ссылочных таблицах, если они существуют.

DELETE t1
FROM ForeignKeyTable t1
INNER JOIN #TEMP_Table_A_RowsToDelete t2
  ON t1.[ForeignKeyColumn] = t2.Id

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

Шаг 3: Удалить строки из основной таблицы.

DELETE t1
FROM Table_A t1
INNER JOIN #TEMP_Table_A_RowsToDelete t2
  ON t1.[Id] = t2.Id

При этом будут удалены строки старше 10 дней, в зависимости от того, что вы добавили в временную таблицу на шаге 1. Это не должно вызывать проблем, если вы удалили все связанные данные на шаге 2.

Вынужно будет повторить вышеуказанные шаги для каждой таблицы в вашем списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...