Как удалить строку в большой базе данных после сохранения новой базы данных (SQL Server) - PullRequest
0 голосов
/ 04 января 2019

У меня есть база данных SQL Server, которая хранит строку в секунду через 1 месяц, 2 месяца, в то время как база данных очень велика - более 1 миллиона строк. Я хочу знать, как сделать резервную копию или удалить старые строки после автоматического обновления базы данных до новой.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Я консультируюсь с кодом @Angel M. и у меня есть результат, который сработал. Спасибо, Ангел

BEGIN
 DECLARE @Ngayhientai Datetime = GETDATE();
 DECLARE @ngayquakhu Datetime;
 DECLARE @datrungay Datetime;
 DECLARE @Daylakieuso int;
 DECLARE @lastyear int;


  SELECT TOP(1) @ngayquakhu = daylabientable.DateTime
 FROM [DatabaseMobus].[dbo].TableModbus daylabientable;

 SELECT @Daylakieuso = DATEDIFF(d,@ngayquakhu,@Ngayhientai)
 FROM [DatabaseMobus].[dbo].[TableModbus];

 IF @Daylakieuso>1
 INSERT INTO [DatabaseMobus].[dbo].[SaoluuTable]([STT],[RegisterModbus],[DateTime])
 SELECT [STT],[RegisterModbus],[DateTime]
 FROM [DatabaseMobus].[dbo].[TableModbus] nguondulieu
  WHERE NOT EXISTS(SELECT 1 FROM [DatabaseMobus].[dbo].[SaoluuTable] laylinkgoc
  WHERE laylinkgoc.DateTime = nguondulieu.DateTime);

 SELECT TOP(1) @datrungay = honmotthang.DateTime
 FROM [DatabaseMobus].[dbo].[SaoluuTable] honmotthang;

 SELECT @lastyear = DATEDIFF(d,@datrungay,@Ngayhientai)
 FROM [DatabaseMobus].[dbo].[TableModbus];

 IF @lastyear=365
 INSERT INTO  [DatabaseMobus].[dbo].[Dulieuhon1nam]([STT],[RegisterModbus],[DateTime]) 
  SELECT [STT],[RegisterModbus],[DateTime]
  FROM [DatabaseMobus].[dbo].[SaoluuTable] thoidinhe
 WHERE NOT EXISTS(SELECT 1 FROM [DatabaseMobus].[dbo].[SaoluuTable] chisokhac
  WHERE chisokhac.DateTime = thoidinhe.DateTime);
 IF @lastyear>365
 DELETE FROM [DatabaseMobus].[dbo].[SaoluuTable];

END

0 голосов
/ 04 января 2019

Я использую своего рода «общий код», который я создал несколько лет назад для архивов, и он работает довольно хорошо. Я немного адаптировался для вас. Предполагается, что у вас есть поле с именем DateRecord с датой, когда запись была добавлена ​​или изменена последней. Кроме того, у вас есть ProdDB и ArchiveDB и одна таблица с такой же структурой в ProdDB, что и в ArchiveDB, за исключением того, что идентификатор в ArchiveDB не может быть IDENTITY, но может иметь УНИКАЛЬНЫЙ индекс:

-- Deletes from the Archive if older than one year
 DELETE FROM ArchiveDB.dbo.YourTable
 WHERE DateDiff(d, DateRecord, GetDate()) > 365 

-- Insert into the ArchiveDB table if older than 30 days (set your request here)
 INSERT INTO ArchiveDB.dbo.YourTable
     SELECT * FROM ProdDB.dbo.YourTable SRC 
     WHERE DateRecord < DATEADD(d, -30, GETDATE())
       AND NOT EXISTS ( 
           SELECT 1 FROM ArchiveDB.dbo.YourTable DST 
           WHERE    SRC.[ID] = DST.[ID]     )

-- Delete from ProdDB if older than 30 days and has been moved to the ArchiveDB
 DELETE FROM ProdDB.dbo.YourTable 
 WHERE DateRecord < DATEADD(d, -30, GETDATE())
   AND EXISTS ( 
       SELECT 1 FROM ArchiveDB.dbo.YourTable DST 
       WHERE        [ID] = DST.[ID]     )
...