Próbuję archiwizować rekordy z tabeli w bazie danych do identycznej tabeli w bazie danych archiwum. Muszę umieć wstawić wszystkie rekordy z datą większą niż trzy lata temu, a następnie usunąć te wiersze. Jednak ta tabela zawiera miliony rekordów na żywo, więc chcę uruchomić to w pętli z grubsza od 100 do 1000 porcji na raz. Do tej pory moja procedura przechowywana wykonuje całą instrukcję insert, następnie instrukcję delete (w transakcji) z zasadniczo tą samą klauzulą WHERE, co instrukcja insert. Moja pętla WHILE szuka najstarszej daty w tabeli, aby określić, kiedy pętla zostanie ukończona. Niektóre z nich wydają się dość nieskuteczne. Czy istnieje sposób, w jaki można wstawić i usunąć w kawałku rekordów bez konieczności wyszukiwania dwa razy w tym samym wykonaniu pętli? Czy istnieje lepszy sposób określenia, kiedy instrukcja WHILE została zakończona? Uruchamianie MS SQL Server 2000.Archiwum SQL Skrypt
To moja obecna procedura (ISAdminDB jest głównym DB ISArchive jest DB archiwum):
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
Które RDBMS? SQL Server, MySQL, coś jeszcze? – MartW
Przeprosiny, MS SQL Server 2000. – Kevin
Zgaduję, że SQL Server – MartW