Phil Brammer mengalami ini dan sejumlah hal lain yang terkait dengan perawatan dan pemberian makan katalog SSIS, yang ia liput di posnya Rekomendasi Pengindeksan Katalog .
Masalah akar
Akar masalah adalah bahwa MS berusaha merancang SSIS dengan mempertimbangkan RI tetapi mereka malas dan membiarkan penghapusan berjenjang terjadi versus menanganinya secara eksplisit.
Resolusi
Sampai MS mengubah cara kerjanya, opsi yang didukung adalah
Saya tahu di klien saya saat ini, kami hanya memuat data di larut malam sehingga SSISDB tenang selama jam kerja.
Jika menjalankan pekerjaan pemeliharaan selama periode tenang bukanlah suatu pilihan, maka Anda sedang mencari untuk membuat pernyataan penghapusan Anda sendiri untuk mencoba membuat penghapusan berjenjang menjadi lebih sedikit .
Di klien saya saat ini, kami telah menjalankan sekitar 200 paket setiap malam selama 10 bulan terakhir dan juga dalam 365 hari sejarah. Tabel terbesar kami, berdasarkan urutan besarnya adalah.
Schema Table RowCount
internal event_message_context 1,869,028
internal operation_messages 1,500,811
internal event_messages 1,500,803
Driver dari semua data itu, internal.operations
hanya memiliki 3300 baris di dalamnya, yang sejalan dengan komentar Phil tentang seberapa eksponensial data ini tumbuh.
Jadi, identifikasi operation_id
untuk dibersihkan dan penghapusan dari tabel daun bekerja kembali ke inti, internal.operations
tabel.
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;
Peringatan biasa berlaku
- jangan percaya kode acak di internet
- gunakan diagram dari ssisstalk dan/atau tabel sistem untuk mengidentifikasi semua dependensi
- Anda mungkin hanya perlu mengelompokkan operasi penghapusan ke dalam operasi yang lebih kecil
- Anda mungkin mendapat manfaat dengan menghentikan RI untuk operasi, tetapi pastikan untuk mengaktifkannya kembali dengan opsi centang agar dapat dipercaya.
- konsultasikan dengan dba Anda jika operasi berlangsung lebih dari 4 jam
edit Juli 2020
Tim Mitchell memiliki kumpulan artikel yang bagus tentang Pembersihan Otomatis Katalog SSIS dan Cara yang lebih baik untuk Membersihkan Basis Data Katalog SSIS dan buku barunya yang keren Katalog SSIS:Instal, Kelola , Amankan dan Pantau Infrastruktur ETL Perusahaan Anda
@Yong Jun Kim dicatat di komentar
Ini tentu saja terjadi jika Anda menggunakan SSIS IR di dalam Azure Data Factory. Anda akan menemukan tabel "normal" masih ada tetapi kosong, dengan *_scaleout
versi yang berisi semua data.
Referensi
- Rekomendasi Pengindeksan Katalog
- Berhati-hatilah Tugas Pemeliharaan Server SSIS
- Kinerja lambat saat Anda menjalankan Tugas Pemeliharaan Server SSIS untuk menghapus data lama di SQL Server 2012