Phil Brammer gặp phải vấn đề này và một loạt những thứ khác liên quan đến việc chăm sóc và nuôi dưỡng danh mục SSIS, mà anh ấy đề cập trên bài đăng của mình Đề xuất lập chỉ mục danh mục .
Vấn đề gốc
Vấn đề gốc rễ là MS đã cố gắng thiết kế SSIS có lưu ý đến RI nhưng họ lười biếng và cho phép việc xóa theo tầng xảy ra thay vì xử lý chúng một cách rõ ràng.
Độ phân giải
Cho đến khi MS thay đổi cách mọi thứ hoạt động, tùy chọn được hỗ trợ sẽ là
Tôi biết ở khách hàng hiện tại của mình, chúng tôi chỉ tải dữ liệu trong vài giờ ngắn ngủi nên SSISDB không hoạt động trong giờ làm việc.
Nếu việc chạy công việc bảo trì trong một khoảng thời gian yên tĩnh không phải là một lựa chọn, thì bạn đang xem xét việc tạo các câu lệnh xóa của riêng mình để cố gắng làm cho các lần xóa theo tầng để hút ít hơn .
Tại khách hàng hiện tại của tôi, chúng tôi đã chạy khoảng 200 gói hàng đêm trong 10 tháng qua và cũng đã có lịch sử 365 ngày. Các bảng lớn nhất của chúng tôi, theo thứ tự độ lớn là.
Schema Table RowCount
internal event_message_context 1,869,028
internal operation_messages 1,500,811
internal event_messages 1,500,803
Trình điều khiển của tất cả dữ liệu đó, internal.operations
chỉ có 3300 hàng trong đó, phù hợp với nhận xét của Phil về cách dữ liệu này phát triển theo cấp số nhân.
Vì vậy, hãy xác định operation_id
được xóa và xóa khỏi các bảng lá hoạt động trở lại lõi, internal.operations
bảng.
USE SSISDB;
SET NOCOUNT ON;
IF object_id('tempdb..#DELETE_CANDIDATES') IS NOT NULL
BEGIN
DROP TABLE #DELETE_CANDIDATES;
END;
CREATE TABLE #DELETE_CANDIDATES
(
operation_id bigint NOT NULL PRIMARY KEY
);
DECLARE @DaysRetention int = 100;
INSERT INTO
#DELETE_CANDIDATES
(
operation_id
)
SELECT
IO.operation_id
FROM
internal.operations AS IO
WHERE
IO.start_time < DATEADD(day, [email protected], CURRENT_TIMESTAMP);
DELETE T
FROM
internal.event_message_context AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
DELETE T
FROM
internal.event_messages AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
DELETE T
FROM
internal.operation_messages AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
-- etc
-- Finally, remove the entry from operations
DELETE T
FROM
internal.operations AS T
INNER JOIN
#DELETE_CANDIDATES AS DC
ON DC.operation_id = T.operation_id;
Những lưu ý thông thường được áp dụng
- không tin tưởng mã từ các ngẫu nhiên trên internet
- sử dụng sơ đồ từ ssistalk và / hoặc bảng hệ thống để xác định tất cả các phần phụ thuộc
- bạn có thể chỉ cần phân đoạn các thao tác xóa của mình thành các thao tác nhỏ hơn
- bạn có thể được lợi bằng cách giảm RI cho các hoạt động nhưng hãy nhớ bật lại chúng bằng tùy chọn kiểm tra để chúng được tin cậy.
- tham khảo ý kiến dba của bạn nếu các hoạt động kéo dài hơn 4 giờ
Tháng 7 năm 2020 chỉnh sửa
Tim Mitchell có một loạt bài viết hay về Tự động dọn dẹp danh mục SSIS và Một cách tốt hơn để làm sạch Cơ sở dữ liệu danh mục SSIS và cuốn sách mới lạ mắt của anh ấy Danh mục SSIS:Cài đặt, Quản lý , Bảo mật và Giám sát Cơ sở hạ tầng ETL Doanh nghiệp của bạn
@Yong Jun Kim ghi chú trong các bình luận
Đây chắc chắn là trường hợp nếu bạn đang sử dụng SSIS IR trong Azure Data Factory. Bạn sẽ thấy các bảng "bình thường" vẫn hiển thị nhưng trống, với *_scaleout
phiên bản chứa tất cả dữ liệu.
Tài liệu tham khảo
- Đề xuất lập chỉ mục danh mục
- Hãy coi chừng Công việc bảo trì máy chủ SSIS
- Hiệu suất chậm khi bạn chạy Công việc Bảo trì Máy chủ SSIS để xóa dữ liệu cũ trong SQL Máy chủ 2012