Bir veritabanındaki bir tablodaki kayıtları bir arşiv veritabanındaki aynı tabloya arşivlemeye çalışıyorum. Üç yıldan daha eski bir tarihle tüm kayıtlar için bir ek yapabilmem ve sonra bu satırları silmem gerekiyor. Ancak, bu tabloda canlı olarak milyonlarca kayıt vardır, bu yüzden bunu bir seferde yaklaşık 100 ila 1000 parça bir döngü içinde çalıştırmak istiyorum. Şimdiye kadar saklı yordam tüm insert deyimini, daha sonra insert deyimiyle esas olarak aynı WHERE yan tümcesiyle bir deyimde (bir işlemde) silme işlemini yapar. WHILE döngüsüm, döngüün ne zaman tamamlandığını belirlemek için tablodaki en eski tarihi arıyor. Bunlardan bazıları oldukça verimsiz görünüyor. Aynı döngü uygulamasında iki kez bakmak zorunda kalmadan kayıtların bir parçasını ekleyip silmem mümkün mü? WHILE ifadesinin ne zaman tamamlandığını belirlemenin daha iyi bir yolu var mı? MS SQL Server 2000SQL Arşiv Komut Dosyası
Running Bu benim şimdiki Prosedürü (ISAdminDB ana DB ise, ISArchive arşiv DB ise): Öncelikle
WHILE ((SELECT MIN([MyTable].[DateTime]) FROM [ISAdminDB].[dbo].[MyTable]) < DATEADD(d, -(3 * 365), GetDate()))
BEGIN
INSERT INTO [ISArchive].[dbo].[MyTable]
(<Fields>)
SELECT TOP 1000 (<Fields>)
FROM [ISAdminDB].[dbo].[MyTable]
WHERE
[MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate())
AND UniqueID in (SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC)
BEGIN TRAN
DELETE FROM [ISAdminDB].[dbo].[MyTable]
WHERE [MyTable].[DateTime] < DATEADD(d, -(3 * 365), GetDate())
AND (UniqueID in (SELECT TOP 1000 UniqueID FROM [ISAdminDB].[dbo].[MyTable] ORDER BY [MyTable].[DateTime] ASC))
COMMIT
END
RDBMS? SQL Server, MySQL, başka bir şey? – MartW
Özür dileriz, MS SQL Server 2000. – Kevin
SQL Server'ı tahmin ediyorum – MartW