Tôi đang viết một quy trình lưu trữ các hàng từ một bảng SQL Server dựa trên một cột ngày giờ. Tôi muốn di chuyển tất cả các hàng với một ngày trước X, nhưng vấn đề là có hàng triệu hàng cho mỗi ngày, do đó, thực hiện BEGIN GIAO DỊCH ... INSERT ... DELETE ... COMMIT cho mỗi ngày mất quá nhiều thời gian và khóa cơ sở dữ liệu cho những người dùng khác.Di chuyển dữ liệu SQL Server trong các khối giới hạn (1000 hàng)
Có cách nào để tôi có thể thực hiện trong các đoạn nhỏ hơn không? Có thể sử dụng ROWCOUNT hoặc một cái gì đó như thế?
tôi muốn ban đầu được coi là một cái gì đó như thế này:
SET ROWCOUNT 1000
DECLARE @RowsLeft DATETIME
DECLARE @ArchiveDate DATETIME
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
WHILE @ROWSLEFT IS NOT NULL
BEGIN
INSERT INTO EventsBackups
SELECT top 1000 * FROM Events
DELETE Events
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
END
Nhưng sau đó tôi nhận ra rằng tôi không thể đảm bảo rằng các hàng tôi đang xóa là những người tôi chỉ sao lưu. Hay tôi có thể ...?
UPDATE: Một tùy chọn Tôi đã coi được thêm một bước:
- SELECT TOP 1000 hàng đáp ứng tiêu chí ngày tôi vào một bảng temp
- Bắt đầu giao dịch
- Chèn từ tạm thời bảng vào bảng lưu trữ
- Xóa khỏi bảng nguồn, tham gia bảng tạm thời trên mỗi cột
- Cam kết chuyển tiếp ction
- Lặp lại 1-5 cho đến khi không có hàng vẫn đáp ứng được các tiêu chí ngày
Có ai có ý tưởng về cách các chi phí của loạt bài này có thể so sánh với một số tùy chọn khác được thảo luận dưới đây?
CHI TIẾT: Tôi đang sử dụng SQL 2005, vì ai đó đã hỏi.
mệnh đề OUTPUT và INTO là bạn của bạn, tra cứu hoặc xem câu trả lời của tôi ... –