s23user Ответов: 1

Процедура хранения для удаления огромных записей


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

Что я уже пробовал:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE spDeleteRecord
@DeleteBatchSize INT,
@DelayTime DATETIME
AS
BEGIN
SET NOCOUNT ON;
DECLARE @DeleteRowCount INT
SET @DeleteRowCount = 1
DECLARE @createDate DATETIME;
DECLARE DelteteRecords_Cursor CURSOR FOR 
SELECT TOP(@DeleteBatchSize) CreateDate
FROM [StoreSystems].[dbo].[tblDept]---------------- Table from which records has to be deleted
--WHERE CreateDate <= DATEADD(month, -6, GETDATE()) 
--order by CreateDate desc; 
OPEN DelteteRecords_Cursor; 
--FETCH FROM DelteteRecords_Cursor
FETCH FROM DelteteRecords_Cursor INTO @createDate; 
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@createDate <= DATEADD(month, -6, GETDATE()))
BEGIN
DELETE FROM [tblDept] ---- Table Name
WHERE CURRENT OF DelteteRecords_Cursor; 
END
END
CLOSE DelteteRecords_Cursor; 
DEALLOCATE DelteteRecords_Cursor; 
--SET @DeleteRowCount = @@ROWCOUNT;
--PRINT @DeleteRowCount;
END
GO

Richard Deeming

Репост
Это по существу тот же самый вопрос, который вы задавали ранее:
http://www.codeproject.com/Questions/1131829/Is-it-possible-to-pass-schema-name-and-table-name[^]

Зачем беспокоиться о том, чтобы задать вопрос, если вы просто собираетесь игнорировать ответы?!

1 Ответов

Рейтинг:
9

Wendelius

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

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

Например, вы можете удалить строки в кусках месяцев, как показано ниже:

DELETE FROM [CampaignUpcDept] WHERE DateColumnName <= DATEADD(month, -50, GETDATE()));
DELETE FROM [CampaignUpcDept] WHERE DateColumnName <= DATEADD(month, -49, GETDATE()));
DELETE FROM [CampaignUpcDept] WHERE DateColumnName <= DATEADD(month, -48, GETDATE()));
...

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

Некоторые другие вещи, которые следует принять во внимание:

  • Конечно, сначала вы создаете резервную копию данных
  • Если объем удаляемых данных велик, рассмотрите возможность фиксации между вызовами, чтобы избежать ненужного роста файла журнала
  • рассмотрите возможность использования модели массового протоколирования или простой модели восстановления для ускорения операции. Однако, прежде чем менять модель восстановления, тщательно обдумайте последствия. Прочитай Модели восстановления (SQL Server)[^]