SSIS Catalog Health
Overview
Why is SSISDB the largest database on this instance, and is the thing that is supposed to hold it back still keeping up?
Retention defaults to 365 days. Logging defaults to Basic. A catalog switched to Verbose for one investigation and left there will quietly outgrow every user database on the instance over a few months, and the cleanup meant to contain it is one nightly single threaded delete that can take longer than a day to do a day of work once it is behind.
Where to find it
Expand a server in the tree, expand a database holding an Integration Services catalog, then SSIS → Catalog Health.
The three things, side by side
What is in the internal tables, by space
Six tables account for essentially all of an oversized SSISDB, and the largest one is almost always internal.event_message_context.
The four settings that decide it
| Setting | What it does |
|---|---|
RETENTION_WINDOW |
How many days of operations are kept. Default 365. |
OPERATION_CLEANUP_ENABLED |
Whether the nightly cleanup runs at all. |
MAX_PROJECT_VERSIONS |
How long each project’s version chain is. |
VERSION_CLEANUP_ENABLED |
Whether the version chains are trimmed. |
The maintenance job’s recent runs
A cleanup whose duration climbs run to run is a cleanup that is losing, and that trend is the finding rather than any single number.
Reading the grid
| Column | What it is |
|---|---|
| Table | The internal table. |
| Rows | Row count. |
| Reserved | Everything it has taken from the file. |
| Data | The rows on disk. |
| Index | What the indexes hold. |
| Share | Reserved as a share of SSISDB. |
| What it holds | One sentence saying what writes into this table and at which logging level. |
The toolbar
| Control | What it does |
|---|---|
| Settings and cleanup | The four settings and the maintenance job’s recent runs. |
| Retention script | Copies a stepped retention script. |
| Recent runs | Opens SSIS Packages Run. |
Nothing here changes anything, and the script steps down
The retention script is a script, in a window, and it steps the window down rather than dropping it in one go.
Going from 365 days to 45 in a single statement is a cascading delete that can run for hours and fill the log, and SSISDB is in FULL recovery by default.
So the script walks the window down in stages, with each stage a statement somebody runs, reads the result of, and then runs the next.
Where the data comes from
| Source | What it gives |
|---|---|
sys.dm_db_partition_stats |
Rows and space for the internal tables. |
catalog.catalog_properties |
RETENTION_WINDOW, OPERATION_CLEANUP_ENABLED, MAX_PROJECT_VERSIONS, VERSION_CLEANUP_ENABLED. |
msdb.dbo.sysjobs, dbo.sysjobhistory |
The SSIS Server Maintenance Job and how long its recent runs took. |
sys.databases |
SSISDB’s recovery model, for the caveat about the log. |
Related reports
| Report | Why you would go there |
|---|---|
| SSIS Who Fills It | Which package is writing all of it. This page says which table; that one says which package. |
| SSIS Overrides | Where a logging level was raised for an investigation and never put back. |
| SSIS Data Flow | What Verbose logging is buying you while it fills the database. |
| SSIS Catalog Inventory | The version chains MAX_PROJECT_VERSIONS bounds. |
| Job Step Failures | The maintenance job, when it is failing rather than merely slow. |
Frequently asked questions
event_message_context is enormous. Something is logging at Verbose. SSIS Who Fills It names the package, and dropping that one package back to Basic takes a minute.
The cleanup job takes longer every night. It is losing. Once a nightly cleanup takes longer than a day to remove a day of data, the backlog grows on its own and stepping the retention window down is the only way out.
Can I just set retention to 45 days? You can, and on a catalog that has been at 365 days for two years that single statement is a cascading delete that can run for hours with SSISDB in FULL recovery. That is why the script steps down instead.
Is cleanup enabled by default? Yes, but it is one of the four settings on this page precisely because it can be turned off and forgotten.