SSIS Package Map
Overview
The master and child structure of an ETL estate is the thing nobody has written down and everyone needs when they change something. Where it has been written down it is out of date.
This is built from last month’s executions, which is the only version that is true.
Where to find it
Expand a server in the tree, expand a database holding an Integration Services catalog, then SSIS → Package Map.
The mechanism
A package started inside another by an Execute Package Task running in process shares its parent’s execution.
So the distinct package names inside one execution are its call graph, and catalog.executions.package_name is the root of it.
Nothing else in the catalog records the relationship at all.
Two findings the graph produces on its own
Drift from what the project was designed to be
- A package marked as an entry point that is only ever called by another.
- A package marked as a child that somebody starts directly.
Both are invisible from SSIS Catalog Inventory, which can only see whether a package ran.
The orphan
A package neither called nor started.
Inventory reports that as never run; this page says why, because it can tell “nothing starts it” from “nothing calls it”.
The honesty
Only edges that ran are edges.
- A child called from a branch nothing took this month is not in the graph.
- An Execute Package Task set to run out of process starts its own execution and never appears in its parent’s executables at all.
Reading the grid
| Column | What it is |
|---|---|
| Package | The package. |
| What it is | Root, intermediate, leaf, or orphan, from its position in the observed graph. |
| Called by | Which packages called it, and how often. |
| Calls | Which packages it called. |
| Runs | How many executions it appeared in. |
| Tasks | How many executables it contributed. |
| Nesting | How deep it sits below a root. |
| Declared | Its entry_point setting, which is what it was designed to be. |
| State | Matches its declaration, or has drifted from it, or is an orphan. |
Declared against What it is, side by side, is the drift finding.
The toolbar
| Control | Options | Default |
|---|---|---|
| Window | 7 days, 30 days, 90 days | 30 days |
| The map as text | Copies the graph as an indented tree, for pasting into a document. | |
| Inventory | Opens SSIS Catalog Inventory. |
Where the data comes from
| Source | What it gives |
|---|---|
catalog.executables |
Every executable inside an execution, with its package_name, which is what the graph is built from. |
catalog.executable_statistics |
The order and nesting inside one execution. |
catalog.executions |
The root package of each execution. |
catalog.packages |
entry_point, which is the declared intent. |
Related reports
| Report | Why you would go there |
|---|---|
| SSIS Catalog Inventory | What is deployed, and what has never run. |
| SSIS Inside the Package | The task level detail inside one of these executions. |
| SSIS Packages Run | The executions the graph was derived from. |
| SSIS Connection Reach | The blast radius, once you know the call structure. |
| SSIS Critical Path | Which package in the chain decided when the night ended. |
Frequently asked questions
A package I know is called does not appear. Either the branch that calls it did not run in the window, or its Execute Package Task runs out of process, which starts a separate execution and leaves no trace of the relationship.
Why not read the packages instead? Because the packages are in the .ispac, which SSISDB stores as a blob it does not parse. What ran is the only structure the catalog can see, and it is also the only one that is current.
An entry point package is only ever called. Somebody built it to be started and it is now a child. That is not broken, but the declaration and the reality disagree, and whoever maintains it should know.
What is an orphan? A package nothing starts and nothing calls. It is deployed, it costs version chain and cleanup, and nothing runs it.