# Metrics reference

<!-- GENERATED by tools/docs/gen_reference.py in ip-oem-mssql-plugin - do not edit by hand -->


This page is generated from the plug-in's own target metadata, for the exact build you deploy, rather than written by hand - so it cannot drift from what the plug-in actually collects. Where another page and this one disagree on a column name, a unit or a threshold, this page is authoritative.

It covers all 78 metric groups and 703 columns on the `ip_mssql_database` target type, each with its collection schedule, its columns, their display labels and units, and the default thresholds that ship.

## How to read a metric group

Every entry has the same shape. The heading gives the group's display name, its internal name in parentheses - the name EM CLI, thresholds and the metric browser use - and its collection schedule. One sentence underneath says what the group collects and where the values come from. Then the column table:

| Column | What it tells you |
|---|---|
| **Column** | The column's internal name, in the form EM CLI and threshold commands take. A `(key)` marker means the column is part of the group's key, so the group returns one row per distinct key value - per database, per index, per wait type - rather than a single row. A group with no key column returns exactly one row per collection. |
| **Label** | The display name shown in the console. |
| **Unit** | The unit Enterprise Manager labels the value with, for example `KB`, `SECOND`, `PERCENTAGE` or `BOOLEAN`. `NA` means the value carries no unit - a count, a state or a string. |
| **Warning** / **Critical** | The default threshold that ships for the column, with its operator. **A blank cell means no default threshold**, which is the normal case: 20 curated thresholds ship, listed on [Alerts and thresholds](/mssql/alerts-and-thresholds.html). A blank cell is not an omission and it does not stop you setting your own. |

Groups marked **configuration snapshot** in their heading behave differently. They collect into Enterprise Manager's configuration history rather than into the metric tables, which is what makes an instance's settings comparable over time and against other instances under **Enterprise -> Configuration**, and what the [compliance rules](/mssql/compliance-rules.html) evaluate. They carry no thresholds and raise no alerts.

Some groups are empty on a given instance by design rather than by fault - the AlwaysOn families on a standalone server, the cluster families under Pacemaker, the Windows registry family on Linux. An empty group is the plug-in reporting that the feature is not present, not a collection failure.

## Microsoft SQL Server Database (`ip_mssql_database`)

### Response (`Response`) - collected every 1 Min

Availability. EM derives the target's Up/Down state from the Status column; a Status below 1 raises the target-down event. This is the only group whose condition is an availability condition rather than a metric threshold.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `Status` | Status (1 = up, 0 = down) | NA |  | < 1 |

### Memory Usage (`MemoryUsage`) - collected every 15 Min

Host and SQL Server memory from sys.dm_os_sys_memory and sys.dm_os_process_memory - physical and page-file totals, what the SQL Server process holds, and the OS memory-state description.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `total_physical_memory_kb` | Total Physical Memory (KB) | KB |  |  |
| `available_physical_memory_kb` | Available Physical Memory (KB) | KB |  |  |
| `server_memory_kb` | Host Used Memory (KB) | KB |  |  |
| `total_page_file_kb` | Total Page File (KB) | KB |  |  |
| `available_page_file_kb` | Available Page File (KB) | KB |  |  |
| `system_memory_state_desc` | System Memory State (text: memory high | low | steady | ...) | NA |  |  |
| `sql_process_memory_kb` | SQL Server Process Memory (KB) | KB |  |  |

### Processor (`Processor`) - collected every 15 Min

CPU counts and utilization from sys.dm_os_sys_info and the scheduler ring buffer, split into the SQL Server process, other processes, and idle. On SQL Server 2017, 2019 and 2022 on Linux the OS idle counter is unreadable, so the three utilization columns are EMPTY rather than zero and cpu_counters_available is 0 - read that flag before treating a zero as a measurement, since an absent numeric is rendered as 0 by some clients. A genuinely saturated host reads the same way. See the boundaries list in the user guide's release notes (section 14.1).

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `cpu_count` | CPU Count | NA |  |  |
| `hyperthread_ratio` | Hyperthread Ratio | NA |  |  |
| `sql_process_utilization` | SQL Process CPU (%) | PERCENTAGE |  |  |
| `system_idle` | System Idle (%) | PERCENTAGE |  |  |
| `other_process_utilization` | Other Process CPU (%) | PERCENTAGE |  |  |
| `cpu_utilization_pct` | CPU Utilization (%) | PERCENTAGE | > 80 | > 90 |
| `cpu_counters_available` | CPU Counters Available (0/1: 1 = OS idle readable) | BOOLEAN |  |  |

### Volume Space (`VolumeSpace`) - collected every 15 Min

Total and available space per volume hosting database files, from sys.dm_os_volume_stats, with a ships-enabled low-space threshold on the available percentage. One row per distinct mount point; on Linux every volume collapses into one row holding the smallest free space.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `volume_mount_point` (key) | Volume Mount Point | NA |  |  |
| `logical_volume_name` | Logical Volume Name | NA |  |  |
| `total_bytes` | Total Bytes | BYTE |  |  |
| `available_bytes` | Available Bytes | BYTE |  |  |
| `available_pct` | Available (%) | PERCENTAGE | < 10 | < 5 |

### SQL Server Configuration (`SQLServer`) - collected every 24 Hr

Instance identity and edition - server and machine name, edition, product version and level, collation, and whether the instance is clustered, HADR-enabled or integrated-security only.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `server_name` | Server Name | NA |  |  |
| `machine_name` | Machine Name | NA |  |  |
| `instance_name` | Instance Name | NA |  |  |
| `edition` | Edition | NA |  |  |
| `product_version` | Product Version | NA |  |  |
| `product_level` | Product Level | NA |  |  |
| `collation` | Server Collation | NA |  |  |
| `is_clustered` | Clustered FCI (0/1: 1 = clustered) | BOOLEAN |  |  |
| `is_hadr_enabled` | AlwaysOn AG Enabled (0/1: 1 = enabled) | BOOLEAN |  |  |
| `is_integrated_security_only` | Windows Auth Only (0/1: 1 = Windows authentication only) | BOOLEAN |  |  |

### Databases (`Database`) - collected every 24 Hr

Per-database inventory from sys.databases - state, recovery model, compatibility level, collation, creation date, and the log-reuse wait that explains why a log is not truncating.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `database_id` | Database ID | NA |  |  |
| `state_desc` | Database State (ONLINE | RESTORING | RECOVERING | SUSPECT | ...) | NA |  |  |
| `recovery_model_desc` | Recovery Model (SIMPLE | FULL | BULK_LOGGED) | NA |  |  |
| `compatibility_level` | Compatibility Level | NA |  |  |
| `collation_name` | Collation | NA |  |  |
| `create_date` | Create Date | NA |  |  |
| `is_read_only` | Read Only (0/1: 1 = read only) | BOOLEAN |  |  |
| `containment_desc` | Containment (NONE | PARTIAL) | NA |  |  |
| `log_reuse_wait_desc` | Log Reuse Wait (NOTHING | LOG_BACKUP | ACTIVE_TRANSACTION | ...) | NA |  |  |
| `owner` | Owner | NA |  |  |

### Database Settings (`DatabaseSetting`) - collected every 24 Hr

Per-database options that matter for correctness and performance: auto-close, auto-shrink, auto-create and auto-update statistics, page verification, snapshot isolation, read-committed snapshot, trustworthy, and Service Broker.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `is_auto_close_on` | Auto Close (0/1: 1 = on) | BOOLEAN |  |  |
| `is_auto_shrink_on` | Auto Shrink (0/1: 1 = on) | BOOLEAN |  |  |
| `is_auto_create_stats_on` | Auto Create Statistics (0/1: 1 = on) | BOOLEAN |  |  |
| `is_auto_update_stats_on` | Auto Update Statistics (0/1: 1 = on) | BOOLEAN |  |  |
| `page_verify_option_desc` | Page Verify (NONE | TORN_PAGE_DETECTION | CHECKSUM) | NA |  |  |
| `snapshot_isolation_state_desc` | Snapshot Isolation (OFF | ON | IN_TRANSITION_TO_ON | ...) | NA |  |  |
| `is_read_committed_snapshot_on` | Read Committed Snapshot (0/1: 1 = on) | BOOLEAN |  |  |
| `is_trustworthy_on` | Trustworthy (0/1: 1 = on) | BOOLEAN |  |  |
| `is_broker_enabled` | Service Broker Enabled (0/1: 1 = enabled) | BOOLEAN |  |  |

### Database Status (`DatabaseStatus`) - collected every 24 Hr

Per-database availability state - online/offline/restoring, user access mode, standby, read-only, and whether the database is encrypted.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `database_id` | Database ID | NA |  |  |
| `state_desc` | Database State (ONLINE | RESTORING | RECOVERING | SUSPECT | ...) | NA |  |  |
| `user_access_desc` | User Access (MULTI_USER | SINGLE_USER | RESTRICTED_USER) | NA |  |  |
| `is_in_standby` | In Standby (0/1: 1 = standby) | BOOLEAN |  |  |
| `is_read_only` | Read Only (0/1: 1 = read only) | BOOLEAN |  |  |
| `is_encrypted` | TDE Encrypted (0/1: 1 = encrypted) | BOOLEAN |  |  |

### Server Configuration Parameters (`DatabaseParameter`) - collected every 24 Hr

Server-level settings from sys.configurations: the configured value, the value in use, the permitted range, and whether the setting is dynamic or advanced. One row per setting.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `parameter_name` (key) | Parameter Name | NA |  |  |
| `configuration_id` | Configuration ID | NA |  |  |
| `value` | Configured Value | NA |  |  |
| `value_in_use` | Running Value | NA |  |  |
| `minimum` | Minimum | NA |  |  |
| `maximum` | Maximum | NA |  |  |
| `is_dynamic` | Dynamic (0/1: 1 = takes effect without restart) | BOOLEAN |  |  |
| `is_advanced` | Advanced Option (0/1: 1 = advanced) | BOOLEAN |  |  |

### Database Files (`DatabaseFile`) - collected every 24 Hr

Every data and log file from sys.master_files - type, physical path, state, current and maximum size, and the autogrowth setting including whether growth is a percentage. Needs VIEW ANY DEFINITION; without it the group is permanently empty.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `logical_name` (key) | Logical Name | NA |  |  |
| `file_id` | File ID | NA |  |  |
| `type_desc` | File Type (ROWS | LOG | FILESTREAM | FULLTEXT) | NA |  |  |
| `physical_name` | Physical Path | NA |  |  |
| `state_desc` | File State (ONLINE | RESTORING | RECOVERING | OFFLINE | DEFUNCT) | NA |  |  |
| `size_kb` | Size (KB) | KB |  |  |
| `max_size_kb` | Max Size (KB, -1=unlimited) | KB |  |  |
| `growth_raw` | Growth (pages, or percent when Growth Is Percent = 1) | NA |  |  |
| `is_percent_growth` | Growth Is Percent (0/1: 1 = percent, 0 = pages) | BOOLEAN |  |  |

### File Groups (`FileGroup`) - collected every 24 Hr

Filegroups per database - type, default and read-only flags, the number of files in the group, and the group's total size.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `filegroup_name` (key) | File Group Name | NA |  |  |
| `filegroup_id` | File Group ID | NA |  |  |
| `type_desc` | File Group Type (ROWS_FILEGROUP | FILESTREAM_DATA_... | ...) | NA |  |  |
| `is_default` | Default File Group (0/1: 1 = default) | BOOLEAN |  |  |
| `is_read_only` | Read Only (0/1: 1 = read only) | BOOLEAN |  |  |
| `file_count` | File Count | NA |  |  |
| `total_size_kb` | Total Size (KB) | KB |  |  |

### Database Free Space (`DbFreespace`) - collected every 24 Hr

Allocated, used and free space per database, plus the size autogrowth can reach (up to each file's max size or the volume's free space) and the headroom left before it, which carries the ships-enabled low-space threshold.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `allocated_kb` | Allocated (KB) | KB |  |  |
| `used_kb` | Used (KB) | KB |  |  |
| `free_kb` | Free (KB) | KB |  |  |
| `free_pct` | Free (% of allocated size) | PERCENTAGE |  |  |
| `reachable_kb` | Reachable Size (KB, with autogrowth and volume free space) | KB |  |  |
| `headroom_kb` | Headroom (KB, reachable size minus used) | KB |  |  |
| `headroom_pct` | Headroom (% of reachable size) | PERCENTAGE | < 15 | < 5 |

### Host Info (`HostInfo`) - collected every 1 Hr

Operating system platform, distribution, release, service pack and SKU from sys.dm_os_host_info, which is what makes the host families Linux-safe.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `host_platform` | Host Platform | NA |  |  |
| `host_distribution` | Host Distribution | NA |  |  |
| `host_release` | Host Release | NA |  |  |
| `host_service_pack_level` | Host Service Pack Level | NA |  |  |
| `host_sku` | Host SKU (Windows code; blank if Host Platform is Linux) | NA |  |  |
| `os_language_version` | OS Language Version (Windows code; 0 on Linux) | NA |  |  |

### Registry Setting (`RegistrySetting`) - collected every 24 Hr

Windows registry values for the instance. Windows-only enrichment; the group returns an empty result on Linux rather than erroring. is_numeric_value is 1 when Value Data is a number and 0 otherwise (text, binary or empty).

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `registry_key` (key) | Registry Key | NA |  |  |
| `value_name` (key) | Value Name | NA |  |  |
| `value_data` | Value Data | NA |  |  |
| `is_numeric_value` | Numeric Value (0/1: 1 = Value Data is a number) | BOOLEAN |  |  |

### FCI / Cluster Identity (`FciIdentity`) - collected every 15 Min

Failover-cluster identity - whether the instance is clustered, the active node, and the external-cluster boundary flag that marks a Linux instance whose availability is managed by Pacemaker rather than WSFC.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `is_clustered` | Clustered FCI (0/1: 1 = clustered) | BOOLEAN |  |  |
| `machine_name` | Virtual Machine Name | NA |  |  |
| `active_node` | Active Node | NA |  |  |
| `host_platform` | Host Platform | NA |  |  |
| `has_availability_group` | Hosts Availability Group (0/1: 1 = yes) | BOOLEAN |  |  |
| `external_cluster_boundary` | External Cluster Boundary (0/1: 1 = Pacemaker, not WSFC) | BOOLEAN |  |  |

### Cluster Nodes (`ClusterNodes`) - collected every 15 Min

WSFC cluster node list with each node's status and whether it currently owns the instance. Empty on a standalone instance, and empty by design under Pacemaker, where WSFC node detail does not exist.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `node_name` (key) | Node Name | NA |  |  |
| `status` | Node Status (0 = up, 1 = down, 2 = paused, 3 = joining) | NA |  |  |
| `status_description` | Node Status Description (Up | Down | Paused | Joining) | NA |  |  |
| `is_current_owner` | Current Owner (0/1: 1 = node owns the instance) | BOOLEAN |  |  |

### General Statistics (`GeneralStatistics`) - collected every 30 Min

SQL Server General Statistics performance counters - connections, processes and logins per second. One row per counter.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `counter_name` (key) | Counter | NA |  |  |
| `cntr_type` | Counter Type (272696576 = bulk count, 65792 = gauge, ...) | NA |  |  |
| `cntr_value` | Value (per sec for Counter Type 272696576, else raw) | NA |  |  |

### SQL Statistics (`SQLStatistics`) - collected every 10 Min

SQL Server SQL Statistics performance counters - batch requests, compilations and recompilations. One row per counter.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `counter_name` (key) | Counter | NA |  |  |
| `cntr_type` | Counter Type (272696576 = bulk count, 65792 = gauge, ...) | NA |  |  |
| `cntr_value` | Value (per sec for Counter Type 272696576, else raw) | NA |  |  |

### Access Methods (`AccessMethods`) - collected every 30 Min

SQL Server Access Methods performance counters - scans, page splits, and index and table access rates. One row per counter.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `counter_name` (key) | Counter | NA |  |  |
| `cntr_type` | Counter Type (272696576 = bulk count, 65792 = gauge, ...) | NA |  |  |
| `cntr_value` | Value (per sec for Counter Type 272696576, else raw) | NA |  |  |

### Buffer Manager (`BufferManager`) - collected every 15 Min

SQL Server Buffer Manager performance counters - page life expectancy, buffer cache hit ratio, and page read/write rates. One row per counter.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `counter_name` (key) | Counter | NA |  |  |
| `cntr_type` | Counter Type (272696576 = bulk count, 65792 = gauge, ...) | NA |  |  |
| `cntr_value` | Value (per sec for Counter Type 272696576, else raw) | NA |  |  |

### Memory Manager (`MemoryManager`) - collected every 15 Min

SQL Server Memory Manager performance counters - target and total server memory, grants pending, and memory-clerk totals. One row per counter.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `counter_name` (key) | Counter | NA |  |  |
| `cntr_type` | Counter Type (272696576 = bulk count, 65792 = gauge, ...) | NA |  |  |
| `cntr_value` | Value (per sec for Counter Type 272696576, else raw) | NA |  |  |

### Latches (`Latches`) - collected every 15 Min

SQL Server Latches performance counters - latch waits and average latch wait time. One row per counter.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `counter_name` (key) | Counter | NA |  |  |
| `cntr_type` | Counter Type (272696576 = bulk count, 65792 = gauge, ...) | NA |  |  |
| `cntr_value` | Value (per sec for Counter Type 272696576, else raw) | NA |  |  |

### Cache Manager (`CacheManager`) - collected every 15 Min

SQL Server Plan Cache performance counters per cache type - cache hit ratio, object counts and pages in use. Keyed by counter and cache instance.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `counter_name` (key) | Counter | NA |  |  |
| `instance_name` (key) | Cache Type | NA |  |  |
| `cntr_type` | Counter Type (272696576 = bulk count, 65792 = gauge, ...) | NA |  |  |
| `cntr_value` | Value (per sec for Counter Type 272696576, else raw) | NA |  |  |

### Process Stats (`ProcessStats`) - collected every 15 Min

The SQL Server process's own memory footprint from sys.dm_os_process_memory - physical memory in use, committed and reserved virtual address space, page faults, and the process memory-utilization percentage.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `physical_memory_in_use_kb` | Physical Memory In Use (KB) | KB |  |  |
| `virtual_address_space_committed_kb` | VAS Committed (KB) | KB |  |  |
| `virtual_address_space_reserved_kb` | VAS Reserved (KB) | KB |  |  |
| `page_fault_count` | Page Faults | NA |  |  |
| `memory_utilization_percentage` | Memory Utilization (%) | PERCENTAGE |  |  |

### Memory Statistics (`MemoryStatistics`) - collected every 15 Min

Derived cache and contention ratios computed in the collection rather than read raw: buffer and plan cache hit ratios, and average latch and lock wait times. The two hit ratios are computed from the ratio/base counter pair, which is a rolling window rather than a lifetime accumulator.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `buffer_cache_hit_ratio_pct` | Buffer Cache Hit Ratio per Interval (%) | PERCENTAGE |  |  |
| `plan_cache_hit_ratio_pct` | Plan Cache Hit Ratio per Interval (%) | PERCENTAGE |  |  |
| `avg_latch_wait_ms` | Avg Latch Wait per Interval (ms) | MILLISECONDS |  |  |
| `avg_lock_wait_ms` | Avg Lock Wait per Interval (ms) | MILLISECONDS |  |  |

### Server Statistics (`ServerStatistics`) - collected every 15 Min

Instance-wide totals from sys.sysprocesses and @@-style counters - CPU and I/O busy time, packet counts and errors, connection counts, and derived CPU-busy and packet-error percentages.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `cpu_busy` | CPU Busy (ticks) | NA |  |  |
| `io_busy` | IO Busy (ticks) | NA |  |  |
| `idle` | Idle (ticks) | NA |  |  |
| `pack_sent` | Packets Sent | NA |  |  |
| `pack_received` | Packets Received | NA |  |  |
| `packet_errors` | Packet Errors | NA |  |  |
| `total_read` | Total Reads | NA |  |  |
| `total_write` | Total Writes | NA |  |  |
| `total_errors` | Total Errors | NA |  |  |
| `connections` | Connections | NA |  |  |
| `max_connections` | Max Connections | NA |  |  |
| `cpu_busy_pct` | CPU Busy (%) | PERCENTAGE |  |  |
| `packet_error_pct` | Packet Error (%) | PERCENTAGE |  |  |

### Latch Wait Time (`LatchWaitTime`) - collected every 15 Min

Average latch wait time in milliseconds, isolated as a single numeric row so it can be charted as a trend.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `avg_latch_wait_ms` | Avg Latch Wait per Interval (ms) | MILLISECONDS |  |  |

### Availability Groups (`AvailabilityGroups`) - collected every 15 Min

One row per availability group - the current primary replica, the primary and secondary recovery health, and the group's overall synchronization health, as text and as the DMV's code (0 not healthy, 1 partially healthy, 2 healthy, -1 unknown).

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `group_id` (key) | Group ID | NA |  |  |
| `group_name` | Group Name | NA |  |  |
| `primary_replica` | Primary Replica | NA |  |  |
| `primary_recovery_health_desc` | Primary Recovery Health (ONLINE_IN_PROGRESS | ONLINE) | NA |  |  |
| `secondary_recovery_health_desc` | Secondary Recovery Health (ONLINE_IN_PROGRESS | ONLINE) | NA |  |  |
| `synchronization_health_desc` | Sync Health (NOT_HEALTHY | PARTIALLY_HEALTHY | HEALTHY) | NA |  |  |
| `synchronization_health` | Sync Health Code (0=unhealthy, 1=partial, 2=healthy, -1=unknown) | NA |  |  |

### Availability Replicas (`Replicas`) - collected every 15 Min

One row per replica in every availability group - server name, role, operational and connected state, recovery health, synchronization health, and join state.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `replica_id` (key) | Replica ID | NA |  |  |
| `group_id` | Group ID | NA |  |  |
| `replica_server_name` | Replica Server | NA |  |  |
| `is_local` | Local Replica (0/1: 1 = this instance) | BOOLEAN |  |  |
| `role_desc` | Role (PRIMARY | SECONDARY | RESOLVING) | NA |  |  |
| `operational_state_desc` | Operational State (ONLINE | OFFLINE | PENDING | FAILED | ...) | NA |  |  |
| `connected_state_desc` | Connected State (DISCONNECTED | CONNECTED) | NA |  |  |
| `recovery_health_desc` | Recovery Health (ONLINE_IN_PROGRESS | ONLINE) | NA |  |  |
| `synchronization_health_desc` | Sync Health (NOT_HEALTHY | PARTIALLY_HEALTHY | HEALTHY) | NA |  |  |
| `join_state_desc` | Join State (NOT_JOINED | JOINED_STANDALONE | JOINED_...) | NA |  |  |

### Availability Databases (`AvailabilityDatabases`) - collected every 15 Min

Per-database, per-replica failover state - whether the database is failover-ready, joined, or pending suspend, plus the recovery and truncation LSNs.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `replica_id` (key) | Replica ID | NA |  |  |
| `group_database_id` (key) | Group Database ID | NA |  |  |
| `database_name` | Database Name | NA |  |  |
| `is_failover_ready` | Failover Ready (0/1: 1 = ready) | BOOLEAN |  |  |
| `is_pending_secondary_suspend` | Pending Secondary Suspend (0/1: 1 = pending) | BOOLEAN |  |  |
| `is_database_joined` | Database Joined (0/1: 1 = joined) | BOOLEAN |  |  |
| `recovery_lsn` | Recovery LSN | NA |  |  |
| `truncation_lsn` | Truncation LSN | NA |  |  |

### Replica Databases (`ReplicaDatabases`) - collected every 15 Min

Per-database synchronization state on each replica - synchronization state and health, and whether data movement is suspended.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `group_id` (key) | Group ID | NA |  |  |
| `replica_id` (key) | Replica ID | NA |  |  |
| `database_id` (key) | Database ID | NA |  |  |
| `database_name` | Database Name | NA |  |  |
| `is_local` | Local Replica (0/1: 1 = this instance) | BOOLEAN |  |  |
| `is_primary_replica` | Primary Replica (0/1: 1 = primary) | BOOLEAN |  |  |
| `synchronization_state_desc` | Sync State (SYNCHRONIZED | SYNCHRONIZING | NOT SYNC... | ...) | NA |  |  |
| `synchronization_health_desc` | Sync Health (NOT_HEALTHY | PARTIALLY_HEALTHY | HEALTHY) | NA |  |  |
| `is_suspended` | Suspended (0/1: 1 = data movement suspended) | BOOLEAN |  |  |

### AlwaysOn Cluster (WSFC Quorum) (`HadrCluster`) - collected every 15 Min

The WSFC quorum backing AlwaysOn - cluster name, quorum type and quorum state. Empty on an instance with no cluster.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `cluster_name` (key) | Cluster Name | NA |  |  |
| `quorum_type` | Quorum Type (0 = node, 1 = node+disk, 2 = node+share, 3 = disk) | NA |  |  |
| `quorum_type_desc` | Quorum Type (NODE_MAJORITY | NODE_AND_DISK_MAJORITY | ...) | NA |  |  |
| `quorum_state` | Quorum State (0 = unknown, 1 = normal, 2 = forced) | NA |  |  |
| `quorum_state_desc` | Quorum State (NORMAL_QUORUM | FORCED_QUORUM | UNKNOWN_...) | NA |  |  |

### AlwaysOn Enabled (`HadrEnabled`) - collected every 15 Min

Whether the AlwaysOn Availability Groups feature is enabled on the instance. A single flag, collected so a target can be told apart from one where AlwaysOn is merely unused.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `is_hadr_enabled` | AlwaysOn Enabled (0/1: 1 = enabled) | BOOLEAN |  |  |

### AG Failover Readiness (`AgFailoverReadiness`) - collected every 15 Min

The flagship AlwaysOn surface: per-database recovery point and recovery time estimates, the send and redo queue depths behind them, the redo rate, a synchronization-state composite, and a link-health flag. Four of these columns carry thresholds. Primary-authoritative - the group is empty on a secondary replica and on a non-AG instance, because only the primary can measure the queues.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `group_id` (key) | AG ID | NA |  |  |
| `group_database_id` (key) | AG Database ID | NA |  |  |
| `replica_id` (key) | Replica ID | NA |  |  |
| `ag_name` | Availability Group | NA |  |  |
| `database_name` | Database | NA |  |  |
| `replica_server_name` | Secondary Replica | NA |  |  |
| `synchronization_state_desc` | Sync State (SYNCHRONIZED | SYNCHRONIZING | NOT SYNC... | ...) | NA |  |  |
| `synchronization_health_desc` | Sync Health (NOT_HEALTHY | PARTIALLY_HEALTHY | HEALTHY) | NA |  |  |
| `is_suspended` | Suspended (0/1: 1 = data movement suspended) | BOOLEAN |  |  |
| `log_send_queue_kb` | Log Send Queue (KB) | KB | > 1048576 | > 5242880 |
| `redo_queue_kb` | Redo Queue (KB) | KB | > 1048576 | > 5242880 |
| `redo_rate_kb_s` | Redo Rate (KB/s) | KBPS |  |  |
| `rpo_seconds` | RPO - Est. Data Loss (s) | SECOND | > 300 | > 900 |
| `rto_seconds` | RTO - Est. Recovery (s) | SECOND |  |  |
| `readiness` | Failover Ready (0/1: 1 = ready) | BOOLEAN |  |  |
| `link_healthy` | Replica Link Healthy (0/1: 1 = healthy) | BOOLEAN |  | < 1 |
| `last_commit_primary` | Primary Last Commit | NA |  |  |
| `last_commit_secondary` | Secondary Last Commit | NA |  |  |
| `commit_position_known` | Commit Position Known (0/1: 1 = RPO is measured) | BOOLEAN |  |  |
| `queue_state_known` | Queue State Known (0/1: 1 = queue sizes reported) | BOOLEAN |  |  |
| `log_send_rate_kb_s` | Log Send Rate (KB/s) | KBPS |  |  |
| `synchronization_state` | Sync State (0=not sync, 1=syncing, 2=synced, 3=revert, 4=init) | NA |  |  |

### Database Mirroring (`MirroringMonitoring`) - collected every 15 Min

Legacy database mirroring state per database - mirroring state, role, safety level, partner and witness, and the redo queue. Empty when no database is mirrored.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_id` (key) | Database ID | NA |  |  |
| `database_name` | Database Name | NA |  |  |
| `mirroring_state_desc` | Mirroring State (SYNCHRONIZED | SYNCHRONIZING | SUSPENDED | ...) | NA |  |  |
| `mirroring_role_desc` | Mirroring Role (PRINCIPAL | MIRROR) | NA |  |  |
| `mirroring_safety_level_desc` | Safety Level (FULL | OFF | UNKNOWN) | NA |  |  |
| `mirroring_partner_name` | Partner Name | NA |  |  |
| `mirroring_partner_instance` | Partner Instance | NA |  |  |
| `mirroring_witness_name` | Witness Name | NA |  |  |
| `mirroring_witness_state_desc` | Witness State (CONNECTED | DISCONNECTED | UNKNOWN) | NA |  |  |
| `mirroring_redo_queue_kb` | Redo Queue (KB) | KB |  |  |

### Database Mirroring Statistics (`MirroringStatistics`) - collected every 15 Min

Database Mirroring performance counters per mirrored database - send and redo queue sizes and transaction rates. Empty when no database is mirrored.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `counter_name` (key) | Counter Name | NA |  |  |
| `cntr_type` | Counter Type (272696576 = bulk count, 65792 = gauge, ...) | NA |  |  |
| `instance_name` (key) | Database | NA |  |  |
| `cntr_value` | Value (raw; cumulative for Counter Type 272696576) | NA |  |  |

### SQL Server Instance Configuration (`SQLServerConfig`) - configuration snapshot, collected every 24 Hr

Configuration snapshot of SQL Server Instance Configuration, captured for configuration history and compliance evaluation rather than for alerting.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `SERVER_NAME` | Server Name | NA |  |  |
| `MACHINE_NAME` | Machine Name | NA |  |  |
| `INSTANCE_NAME` | Instance Name | NA |  |  |
| `EDITION` | Edition | NA |  |  |
| `PRODUCT_VERSION` | Product Version | NA |  |  |
| `PRODUCT_LEVEL` | Product Level | NA |  |  |
| `COLLATION` | Server Collation | NA |  |  |
| `IS_CLUSTERED` | Clustered FCI (0/1: 1 = clustered) | BOOLEAN |  |  |
| `IS_HADR_ENABLED` | AlwaysOn AG Enabled (0/1: 1 = enabled) | BOOLEAN |  |  |
| `IS_INTEGRATED_SECURITY_ONLY` | Windows Auth Only (0/1: 1 = Windows authentication only) | BOOLEAN |  |  |

### Database Settings Configuration (`DatabaseSettingConfig`) - configuration snapshot, collected every 24 Hr

Configuration snapshot of Database Settings Configuration, captured for configuration history and compliance evaluation rather than for alerting.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `DATABASE_NAME` (key) | Database Name | NA |  |  |
| `IS_AUTO_CLOSE_ON` | Auto Close (0/1: 1 = on) | BOOLEAN |  |  |
| `IS_AUTO_SHRINK_ON` | Auto Shrink (0/1: 1 = on) | BOOLEAN |  |  |
| `IS_AUTO_CREATE_STATS_ON` | Auto Create Statistics (0/1: 1 = on) | BOOLEAN |  |  |
| `IS_AUTO_UPDATE_STATS_ON` | Auto Update Statistics (0/1: 1 = on) | BOOLEAN |  |  |
| `PAGE_VERIFY_OPTION_DESC` | Page Verify Option | NA |  |  |
| `SNAPSHOT_ISOLATION_STATE_DESC` | Snapshot Isolation | NA |  |  |
| `IS_READ_COMMITTED_SNAPSHOT_ON` | Read Committed Snapshot (0/1: 1 = on) | BOOLEAN |  |  |
| `IS_TRUSTWORTHY_ON` | Trustworthy (0/1: 1 = on) | BOOLEAN |  |  |
| `IS_BROKER_ENABLED` | Service Broker Enabled (0/1: 1 = enabled) | BOOLEAN |  |  |

### AlwaysOn Databases Configuration (`HadrDatabasesConfig`) - configuration snapshot, collected every 24 Hr

Configuration snapshot of AlwaysOn Databases Configuration, captured for configuration history and compliance evaluation rather than for alerting.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `GROUP_ID` (key) | Availability Group ID | NA |  |  |
| `REPLICA_ID` (key) | Replica ID | NA |  |  |
| `DATABASE_ID` (key) | Database ID | NA |  |  |
| `DATABASE_NAME` | Database Name | NA |  |  |
| `IS_LOCAL` | Local Replica (0/1: 1 = this instance) | BOOLEAN |  |  |
| `IS_PRIMARY_REPLICA` | Primary Replica (0/1: 1 = primary) | BOOLEAN |  |  |
| `SYNCHRONIZATION_STATE_DESC` | Synchronization State | NA |  |  |
| `SYNCHRONIZATION_HEALTH_DESC` | Synchronization Health | NA |  |  |
| `IS_SUSPENDED` | Suspended (0/1: 1 = data movement suspended) | BOOLEAN |  |  |

### SQL Server Locks (`SQLServerLock`) - collected every 15 Min

Lock counts aggregated by resource type, request mode and status, from sys.dm_tran_locks - the shape of current locking rather than individual locks.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `resource_type` (key) | Resource Type | NA |  |  |
| `request_mode` (key) | Request Mode | NA |  |  |
| `request_status` (key) | Request Status (GRANT | WAIT | CONVERT | ...) | NA |  |  |
| `lock_count` | Lock Count | NA |  |  |

### Blocked Sessions History (`BlockedSessionHistory`) - collected every 15 Min

Blocked requests with both sides of each block on one row - blocked and blocking session, the SQL text of both, how long the blocked request has waited in milliseconds, the wait type and the resource waited on (which says whether the block is on a table, an index, a page or a row), the database, login, host and program for both sides, and the session at the head of the blocking chain. The Blocking page shows it live and over a range you choose. Request Start Time separates one blocked request from the next when a session is blocked again. Empty when nothing is blocked, which is the normal state.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `session_id` (key) | Blocked Session ID | NA |  |  |
| `request_id` (key) | Request ID | NA |  |  |
| `request_start_time` | Request Start Time | NA |  |  |
| `blocking_session_id` | Blocking Session ID | NA |  |  |
| `head_blocker_session_id` | Head Blocker Session ID | NA |  |  |
| `blocker_is_head` | Blocker Is Head of Chain | NA |  |  |
| `wait_type` | Wait Type | NA |  |  |
| `wait_time` | Blocked Time (ms) | MILLISECONDS |  |  |
| `wait_resource` | Wait Resource | NA |  |  |
| `database_name` | Database | NA |  |  |
| `login_name` | Blocked Login | NA |  |  |
| `host_name` | Blocked Host | NA |  |  |
| `program_name` | Blocked Program | NA |  |  |
| `blocking_login_name` | Blocking Login | NA |  |  |
| `blocking_host_name` | Blocking Host | NA |  |  |
| `blocking_program_name` | Blocking Program | NA |  |  |
| `sql_text` | Blocked SQL Text | NA |  |  |
| `blocking_sql_text` | Blocking SQL Text | NA |  |  |

### Locks (`Locks`) - collected every 15 Min

Current lock requests from sys.dm_tran_locks - the session holding or waiting, the resource and its subtype, the requested mode, and the request status - one row per key. Locks that share a key are merged into one row: Resource Description reads N locks when their descriptions differ (for example many row locks of one session on one index) and the shared description followed by (N locks) when they are the same, and Database or Resource Subtype reads (several databases) or (several subtypes) when the merged locks differ. A row standing for one lock keeps that lock's own description. lock_count carries the number of locks in the row as a number.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `session_id` (key) | Session ID | NA |  |  |
| `resource_type` (key) | Resource Type | NA |  |  |
| `resource_associated_entity_id` (key) | Resource Entity ID | NA |  |  |
| `database_name` | Database | NA |  |  |
| `resource_subtype` | Resource Subtype | NA |  |  |
| `request_mode` (key) | Request Mode | NA |  |  |
| `request_type` | Request Type | NA |  |  |
| `request_status` (key) | Request Status (GRANT | WAIT | CONVERT | ...) | NA |  |  |
| `resource_description` | Resource Description | NA |  |  |
| `lock_count` | Lock Count (locks merged into this row) | NA |  |  |

### Top Queries by CPU (`TopQueriesCpu`) - collected every 15 Min

Top cached statements by total CPU (worker) time, from sys.dm_exec_query_stats with the statement text - executions, total and average worker time, elapsed time, and logical and physical I/O. These are the correct top 500, but they are stored UNORDERED: EM keys metric rows and does not preserve the query's ranking, so sort client-side rather than trusting the order you receive.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `sql_handle` (key) | SQL Handle | NA |  |  |
| `plan_handle` (key) | Plan Handle | NA |  |  |
| `statement_start_offset` (key) | Statement Offset | NA |  |  |
| `statement_end_offset` (key) | Statement End Offset | NA |  |  |
| `execution_count` | Executions (Cumulative) | NA |  |  |
| `total_worker_time` | Cumulative CPU (us) | MICROSEC |  |  |
| `avg_worker_time` | Avg CPU per Execution (us) | MICROSEC |  |  |
| `total_elapsed_time` | Cumulative Elapsed (us) | MICROSEC |  |  |
| `total_logical_reads` | Logical Reads (Cumulative) | NA |  |  |
| `total_physical_reads` | Physical Reads (Cumulative) | NA |  |  |
| `total_logical_writes` | Logical Writes (Cumulative) | NA |  |  |
| `last_execution_time` | Last Execution (retired, always blank) | NA |  |  |
| `sql_text` | SQL Text | NA |  |  |
| `query_hash` | Query Hash | NA |  |  |
| `query_plan_hash` | Query Plan Hash | NA |  |  |
| `interval_execution_count` | Executions (Interval) | NA |  |  |
| `interval_worker_time` | CPU (Interval) | MICROSEC |  |  |
| `interval_elapsed_time` | Elapsed (Interval) | MICROSEC |  |  |
| `interval_logical_reads` | Logical Reads (Interval) | NA |  |  |
| `interval_physical_reads` | Physical Reads (Interval) | NA |  |  |
| `interval_logical_writes` | Logical Writes (Interval) | NA |  |  |
| `total_grant_mb` | Granted Memory (Cumulative) | MB |  |  |
| `max_grant_mb` | Max Granted Memory | MB |  |  |
| `total_used_grant_mb` | Used Memory (Cumulative) | MB |  |  |
| `max_used_grant_mb` | Max Used Memory | MB |  |  |
| `interval_grant_mb` | Granted Memory (Interval) | MB |  |  |
| `interval_seconds` | Interval Length | SECOND |  |  |
| `query_plan_hash_id` | Plan Hash ID (low 48 bits of Query Plan Hash) | NA |  |  |
| `last_execution_epoch` | Last Execution (seconds since 1970, server clock) | NA |  |  |

### Top Queries by Executions (`TopQueriesExec`) - collected every 15 Min

The same statement statistics as Top Queries by CPU, ranked by execution count instead - the queries that run most often rather than the ones that cost most per run. Stored unordered for the same reason; sort client-side.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `sql_handle` (key) | SQL Handle | NA |  |  |
| `plan_handle` (key) | Plan Handle | NA |  |  |
| `statement_start_offset` (key) | Statement Offset | NA |  |  |
| `statement_end_offset` (key) | Statement End Offset | NA |  |  |
| `execution_count` | Executions (Cumulative) | NA |  |  |
| `total_worker_time` | Cumulative CPU (us) | MICROSEC |  |  |
| `avg_worker_time` | Avg CPU per Execution (us) | MICROSEC |  |  |
| `total_elapsed_time` | Cumulative Elapsed (us) | MICROSEC |  |  |
| `total_logical_reads` | Logical Reads (Cumulative) | NA |  |  |
| `total_physical_reads` | Physical Reads (Cumulative) | NA |  |  |
| `total_logical_writes` | Logical Writes (Cumulative) | NA |  |  |
| `last_execution_time` | Last Execution (retired, always blank) | NA |  |  |
| `sql_text` | SQL Text | NA |  |  |
| `query_hash` | Query Hash | NA |  |  |
| `query_plan_hash` | Query Plan Hash | NA |  |  |
| `interval_execution_count` | Executions (Interval) | NA |  |  |
| `interval_worker_time` | CPU (Interval) | MICROSEC |  |  |
| `interval_elapsed_time` | Elapsed (Interval) | MICROSEC |  |  |
| `interval_logical_reads` | Logical Reads (Interval) | NA |  |  |
| `interval_physical_reads` | Physical Reads (Interval) | NA |  |  |
| `interval_logical_writes` | Logical Writes (Interval) | NA |  |  |
| `total_grant_mb` | Granted Memory (Cumulative) | MB |  |  |
| `max_grant_mb` | Max Granted Memory | MB |  |  |
| `total_used_grant_mb` | Used Memory (Cumulative) | MB |  |  |
| `max_used_grant_mb` | Max Used Memory | MB |  |  |
| `interval_grant_mb` | Granted Memory (Interval) | MB |  |  |
| `interval_seconds` | Interval Length | SECOND |  |  |
| `last_execution_epoch` | Last Execution (seconds since 1970, server clock) | NA |  |  |

### Top Queries by Memory Grant (`TopQueriesMemory`) - collected every 15 Min

The same statement statistics as Top Queries by CPU, ranked by total granted memory instead - which queries the optimizer reserved the most workspace memory for, in megabytes, alongside the peak single grant and how much of it was actually used. The grant columns are blank on builds before SQL Server 2016 SP2 / 2017 CU3, which do not carry them, and on those builds this group falls back to CPU ordering. Stored unordered like the other top-N groups; sort client-side.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `sql_handle` (key) | SQL Handle | NA |  |  |
| `plan_handle` (key) | Plan Handle | NA |  |  |
| `statement_start_offset` (key) | Statement Offset | NA |  |  |
| `statement_end_offset` (key) | Statement End Offset | NA |  |  |
| `execution_count` | Executions (Cumulative) | NA |  |  |
| `total_worker_time` | Cumulative CPU (us) | MICROSEC |  |  |
| `avg_worker_time` | Avg CPU per Execution (us) | MICROSEC |  |  |
| `total_elapsed_time` | Cumulative Elapsed (us) | MICROSEC |  |  |
| `total_logical_reads` | Logical Reads (Cumulative) | NA |  |  |
| `total_physical_reads` | Physical Reads (Cumulative) | NA |  |  |
| `total_logical_writes` | Logical Writes (Cumulative) | NA |  |  |
| `last_execution_time` | Last Execution (retired, always blank) | NA |  |  |
| `sql_text` | SQL Text | NA |  |  |
| `query_hash` | Query Hash | NA |  |  |
| `query_plan_hash` | Query Plan Hash | NA |  |  |
| `interval_execution_count` | Executions (Interval) | NA |  |  |
| `interval_worker_time` | CPU (Interval) | MICROSEC |  |  |
| `interval_elapsed_time` | Elapsed (Interval) | MICROSEC |  |  |
| `interval_logical_reads` | Logical Reads (Interval) | NA |  |  |
| `interval_physical_reads` | Physical Reads (Interval) | NA |  |  |
| `interval_logical_writes` | Logical Writes (Interval) | NA |  |  |
| `total_grant_mb` | Granted Memory (Cumulative) | MB |  |  |
| `max_grant_mb` | Max Granted Memory | MB |  |  |
| `total_used_grant_mb` | Used Memory (Cumulative) | MB |  |  |
| `max_used_grant_mb` | Max Used Memory | MB |  |  |
| `interval_grant_mb` | Granted Memory (Interval) | MB |  |  |
| `interval_seconds` | Interval Length | SECOND |  |  |
| `last_execution_epoch` | Last Execution (seconds since 1970, server clock) | NA |  |  |

### Query Plan Statistics (`QueryPlanStatistics`) - collected every 15 Min

Cached execution plans aggregated per plan handle - how many statements the plan covers, executions, and the CPU, elapsed and I/O totals attributable to it. The top 500 by total CPU, stored UNORDERED like the other top-N groups; sort client-side.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `plan_handle` (key) | Plan Handle | NA |  |  |
| `statement_count` | Statement Count | NA |  |  |
| `execution_count` | Executions (Cumulative) | NA |  |  |
| `total_worker_time` | Cumulative CPU (us) | MICROSEC |  |  |
| `total_elapsed_time` | Cumulative Elapsed (us) | MICROSEC |  |  |
| `total_logical_reads` | Logical Reads (Cumulative) | NA |  |  |
| `total_physical_reads` | Physical Reads (Cumulative) | NA |  |  |
| `total_logical_writes` | Logical Writes (Cumulative) | NA |  |  |
| `last_execution_time` | Last Execution (retired, always blank) | NA |  |  |
| `query_hash` | Query Hash | NA |  |  |
| `query_plan_hash` | Query Plan Hash | NA |  |  |
| `interval_execution_count` | Executions (Interval) | NA |  |  |
| `interval_worker_time` | CPU (Interval) | MICROSEC |  |  |
| `interval_elapsed_time` | Elapsed (Interval) | MICROSEC |  |  |
| `interval_logical_reads` | Logical Reads (Interval) | NA |  |  |
| `interval_physical_reads` | Physical Reads (Interval) | NA |  |  |
| `interval_logical_writes` | Logical Writes (Interval) | NA |  |  |
| `total_grant_mb` | Granted Memory (Cumulative) | MB |  |  |
| `max_grant_mb` | Max Granted Memory | MB |  |  |
| `total_used_grant_mb` | Used Memory (Cumulative) | MB |  |  |
| `max_used_grant_mb` | Max Used Memory | MB |  |  |
| `interval_grant_mb` | Granted Memory (Interval) | MB |  |  |
| `interval_seconds` | Interval Length | SECOND |  |  |
| `last_execution_epoch` | Last Execution (seconds since 1970, server clock) | NA |  |  |

### Top Sessions (`TopSessions`) - collected every 15 Min

The busiest sessions from sys.dm_exec_sessions - login, host, program, status, CPU and memory use, scheduled and elapsed time, and logical and physical I/O. The top 500 by CPU, stored UNORDERED like the other top-N groups; sort client-side.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `session_id` (key) | Session ID | NA |  |  |
| `login_name` | Login | NA |  |  |
| `host_name` | Host | NA |  |  |
| `program_name` | Program | NA |  |  |
| `status` | Session Status (running | sleeping | dormant | preconnect) | NA |  |  |
| `cpu_time` | CPU Time (ms) | MILLISECONDS |  |  |
| `memory_usage` | Memory (pages) | NA |  |  |
| `total_scheduled_time` | Scheduled Time (ms) | MILLISECONDS |  |  |
| `total_elapsed_time` | Total Elapsed (ms) | MILLISECONDS |  |  |
| `logical_reads` | Logical Reads | NA |  |  |
| `reads` | Reads | NA |  |  |
| `writes` | Writes | NA |  |  |
| `database_name` | Database | NA |  |  |
| `last_request_start_time` | Last Request Start | NA |  |  |

### Index Fragmentation (`IndexFragmentation`) - collected every 360 Min

Average fragmentation percentage and page count per index partition and allocation unit, from sys.dm_db_index_physical_stats in LIMITED mode, for every index of 1,000 pages or more in total. Every partition and allocation unit of such an index is listed so its size is whole; fragmentation is blank on a unit under 1,000 pages, where it is not meaningful. Collected on a long schedule because the scan is not free.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database | NA |  |  |
| `schema_name` (key) | Schema | NA |  |  |
| `table_name` (key) | Table | NA |  |  |
| `index_name` (key) | Index | NA |  |  |
| `partition_number` (key) | Partition | NA |  |  |
| `alloc_unit_type_desc` (key) | Alloc Unit Type (IN_ROW_DATA | LOB_DATA | ROW_OVERFLOW_DATA) | NA |  |  |
| `index_id` | Index ID | NA |  |  |
| `index_type_desc` | Index Type (CLUSTERED INDEX | NONCLUSTERED INDEX | HEAP | ...) | NA |  |  |
| `avg_fragmentation_in_percent` | Fragmentation % | PERCENTAGE |  |  |
| `page_count` | Page Count | NA |  |  |

### Index Usage (`IndexUsage`) - collected every 60 Min

How each index is actually used, from sys.dm_db_index_usage_stats - seeks, scans, lookups and updates, with the timestamps of the last of each. An index with updates and no reads is a maintenance cost with no return.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database | NA |  |  |
| `schema_name` (key) | Schema | NA |  |  |
| `table_name` (key) | Table | NA |  |  |
| `index_name` (key) | Index | NA |  |  |
| `index_id` | Index ID | NA |  |  |
| `user_seeks` | User Seeks | NA |  |  |
| `user_scans` | User Scans | NA |  |  |
| `user_lookups` | User Lookups | NA |  |  |
| `user_updates` | User Updates | NA |  |  |
| `last_user_seek` | Last Seek | NA |  |  |
| `last_user_scan` | Last Scan | NA |  |  |
| `last_user_update` | Last Update | NA |  |  |

### Missing Indexes (`MissingIndex`) - collected every 60 Min

Indexes the optimizer wanted and did not find, from the missing-index DMVs - the table, the equality, inequality and included columns, the seeks and scans that would have used it, the average user impact, and a derived improvement measure for ranking. The Create Index dialog on the Indexes page acts on these rows.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `group_handle` (key) | Group Handle | NA |  |  |
| `database_name` | Database | NA |  |  |
| `table_statement` | Table | NA |  |  |
| `equality_columns` | Equality Columns | NA |  |  |
| `inequality_columns` | Inequality Columns | NA |  |  |
| `included_columns` | Included Columns | NA |  |  |
| `unique_compiles` | Unique Compiles | NA |  |  |
| `user_seeks` | User Seeks | NA |  |  |
| `user_scans` | User Scans | NA |  |  |
| `avg_total_user_cost` | Avg Cost | NA |  |  |
| `avg_user_impact` | Avg Impact % | PERCENTAGE |  |  |
| `improvement_measure` | Improvement Measure | NA |  |  |

### Wait Type History (`WaitTypeHistory`) - collected every 15 Min

Wait statistics per wait type from sys.dm_os_wait_stats. The task count, wait time and the signal/resource split are PER-INTERVAL deltas against the previous collection, not lifetime totals - the DMV accumulates since server start, and differencing it at collection is what lets a wait type that stopped waiting show as quiet. Maximum wait time is a gauge. Blank on the first collection and after a restart; interval_seconds states the window each row covers.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `wait_type` (key) | Wait Type | NA |  |  |
| `waiting_tasks_count` | Waiting Tasks (Interval) | NA |  |  |
| `wait_time_ms` | Wait Time (Interval, ms) | MILLISECONDS |  |  |
| `max_wait_time_ms` | Max Wait (ms) | MILLISECONDS |  |  |
| `signal_wait_time_ms` | Signal Wait (Interval, ms) | MILLISECONDS |  |  |
| `resource_wait_time_ms` | Resource Wait (Interval, ms) | MILLISECONDS |  |  |
| `interval_seconds` | Interval Length | SECOND |  |  |

### File I/O Statistics (`FileIoStats`) - collected every 15 Min

Per-file I/O from sys.dm_io_virtual_file_stats. Read and write counts, bytes and stall times are PER-INTERVAL deltas against the previous collection, so an increase or decrease in a file's I/O between snapshots is visible directly; size on disk is a gauge. Blank on the first collection and after a restart; interval_seconds states the window each row covers.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_id` (key) | Database ID | NA |  |  |
| `database_name` | Database | NA |  |  |
| `file_id` (key) | File ID | NA |  |  |
| `logical_name` | Logical Name | NA |  |  |
| `physical_name` | Physical Name | NA |  |  |
| `file_type` | File Type (ROWS | LOG | FILESTREAM | FULLTEXT) | NA |  |  |
| `num_of_reads` | Reads (Interval) | NA |  |  |
| `num_of_writes` | Writes (Interval) | NA |  |  |
| `num_of_bytes_read` | Bytes Read (Interval) | BYTE |  |  |
| `num_of_bytes_written` | Bytes Written (Interval) | BYTE |  |  |
| `io_stall_read_ms` | Read Stall (Interval, ms) | MILLISECONDS |  |  |
| `io_stall_write_ms` | Write Stall (Interval, ms) | MILLISECONDS |  |  |
| `io_stall` | Total Stall (Interval, ms) | MILLISECONDS |  |  |
| `size_on_disk_mb` | Size on Disk (MB) | MB |  |  |
| `interval_seconds` | Interval Length | SECOND |  |  |
| `avg_read_latency_ms` | Avg Read Latency (Interval, ms) | MILLISECONDS | > 50 | > 100 |
| `avg_write_latency_ms` | Avg Write Latency (Interval, ms) | MILLISECONDS | > 50 | > 100 |

### Database IOPS (`DatabaseIops`) - collected every 15 Min

The same virtual file statistics rolled up per database, giving read, write and total I/O counts, bytes, and stall times without the per-file detail. All of them are PER-INTERVAL deltas against the previous collection; interval_seconds states the window each row covers, and the console divides by it to chart per-second rates. Blank on the first collection and after a restart.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_id` (key) | Database ID | NA |  |  |
| `database_name` | Database | NA |  |  |
| `num_of_reads` | Reads (Interval) | NA |  |  |
| `num_of_writes` | Writes (Interval) | NA |  |  |
| `num_of_ios` | Total I/Os (Interval) | NA |  |  |
| `num_of_bytes_read` | Bytes Read (Interval) | BYTE |  |  |
| `num_of_bytes_written` | Bytes Written (Interval) | BYTE |  |  |
| `io_stall_read_ms` | Read Stall (Interval, ms) | MILLISECONDS |  |  |
| `io_stall_write_ms` | Write Stall (Interval, ms) | MILLISECONDS |  |  |
| `io_stall` | Total Stall (Interval, ms) | MILLISECONDS |  |  |
| `interval_seconds` | Interval Length | SECOND |  |  |

### SQL Server Backups (`Backups`) - collected every 60 Min

Backup history from msdb - one row per backup set with type, start and finish times, raw and compressed size, recovery model, copy-only flag, and who ran it. This is the trending source; Last Database Backup is the current-state one.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `backup_set_id` (key) | Backup Set ID | NA |  |  |
| `media_set_id` | Media Set ID | NA |  |  |
| `database_name` | Database | NA |  |  |
| `backup_type` | Backup Type (D = full, I = diff, L = log, F = file, ...) | NA |  |  |
| `backup_start_date` | Start Date | NA |  |  |
| `backup_finish_date` | Finish Date | NA |  |  |
| `backup_size_bytes` | Backup Size (bytes) | BYTE |  |  |
| `compressed_backup_size_bytes` | Compressed Size (bytes) | BYTE |  |  |
| `user_name` | User Name | NA |  |  |
| `recovery_model` | Recovery Model (SIMPLE | FULL | BULK_LOGGED) | NA |  |  |
| `is_copy_only` | Copy Only (0/1: 1 = copy-only backup) | BOOLEAN |  |  |
| `server_name` | Server Name | NA |  |  |
| `machine_name` | Machine Name | NA |  |  |
| `backup_set_name` | Backup Set Name | NA |  |  |

### Last Database Backup (`LastDatabaseBackup`) - collected every 60 Min

The most recent backup per database with its age in both days and hours, the last full and last log backup dates, and the recovery model. hours_since_last_backup carries the RPO threshold and is EMPTY for a database that has never been backed up - that state is reported by never_backed_up (1 or 0) and by hours_unbacked, which holds how long such a database has existed and carries the RPO threshold for the never case. hours_unbacked is blank for a database that has a backup (Never Backed Up = 0). For master and model the age runs from 2003-04-08, the create date SQL Server ships in their template, not from when the instance was installed. days_since_last_backup reports -1 for it, which the console renders as Never.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database | NA |  |  |
| `days_since_last_backup` | Days Since Last Backup (-1 = never backed up) | DAYS |  |  |
| `last_backup_date` | Last Backup Date | NA |  |  |
| `last_backup_type` | Last Backup Type (D = full, I = diff, L = log, blank = none) | NA |  |  |
| `last_full_backup_date` | Last Full Backup Date | NA |  |  |
| `last_log_backup_date` | Last Log Backup Date | NA |  |  |
| `recovery_model_desc` | Recovery Model (SIMPLE | FULL | BULK_LOGGED) | NA |  |  |
| `hours_since_last_backup` | Hours Since Last Backup (blank if Never Backed Up = 1) | HOURS | > 48 | > 168 |
| `never_backed_up` | Never Backed Up (0/1: 1 = no backup on record) | BOOLEAN |  |  |
| `hours_unbacked` | Hours Unbacked (blank if Never Backed Up = 0; master/model 2003) | HOURS | > 48 | > 168 |

### Transaction Log Space (`TransactionLog`) - collected every 30 Min

Per-database transaction log size and the percentage of log space used, which carries a threshold - a log filling up is the common cause of a database becoming unwritable.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database | NA |  |  |
| `log_size_mb` | Log Size (MB) | MB |  |  |
| `log_space_used_pct` | Log Space Used (%) | PERCENTAGE | > 75 | > 90 |
| `log_space_available_pct` | Log Space Available (%) | PERCENTAGE |  |  |

### Database I/O By Type (`DatabaseIoByType`) - collected every 15 Min

Per-database I/O split by file type, so data-file and log-file activity can be told apart - the log is the write-latency-sensitive half. The I/O counters are PER-INTERVAL deltas against the previous collection; size on disk is a gauge. Blank on the first collection and after a restart; interval_seconds states the window each row covers.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_id` (key) | Database ID | NA |  |  |
| `database_name` | Database | NA |  |  |
| `file_type` (key) | File Type (ROWS | LOG | FILESTREAM | FULLTEXT) | NA |  |  |
| `num_of_reads` | Reads (Interval) | NA |  |  |
| `num_of_writes` | Writes (Interval) | NA |  |  |
| `num_of_ios` | Total I/Os (Interval) | NA |  |  |
| `num_of_bytes_read` | Bytes Read (Interval) | BYTE |  |  |
| `num_of_bytes_written` | Bytes Written (Interval) | BYTE |  |  |
| `io_stall_read_ms` | Read Stall (Interval, ms) | MILLISECONDS |  |  |
| `io_stall_write_ms` | Write Stall (Interval, ms) | MILLISECONDS |  |  |
| `io_stall` | Total Stall (Interval, ms) | MILLISECONDS |  |  |
| `size_on_disk_mb` | Size on Disk (MB) | MB |  |  |
| `interval_seconds` | Interval Length | SECOND |  |  |
| `avg_read_latency_ms` | Avg Read Latency (Interval, ms) | MILLISECONDS |  |  |
| `avg_write_latency_ms` | Avg Write Latency (Interval, ms) | MILLISECONDS |  |  |

### SQL Server Processes (`Processes`) - collected every 15 Min

Current sessions and requests - blocking session, CPU time, program and command, login time, execution state, and the current wait type and wait time.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `session_id` (key) | Session ID | NA |  |  |
| `blocking_session_id` | Blocking Session ID | NA |  |  |
| `cpu_time_ms` | CPU Time (ms) | MILLISECONDS |  |  |
| `program_name` | Program Name | NA |  |  |
| `command` | Command | NA |  |  |
| `login_time` | Login Time | NA |  |  |
| `database_name` | Database | NA |  |  |
| `execution_state` | Execution State (running | runnable | suspended | sleeping) | NA |  |  |
| `host_name` | Host Name | NA |  |  |
| `login_name` | Login Name | NA |  |  |
| `memory_usage_pages` | Memory Usage (pages) | NA |  |  |
| `process_state` | Session State (running | sleeping | dormant | preconnect) | NA |  |  |
| `wait_type` | Wait Type | NA |  |  |
| `wait_time_ms` | Wait Time (ms) | MILLISECONDS |  |  |

### Logins (`Login`) - collected every 60 Min

Server-level principals from sys.server_principals - type, whether disabled, creation and modification dates, and the default database and language.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `name` (key) | Login Name | NA |  |  |
| `type_code` | Type Code | NA |  |  |
| `type_desc` | Login Type (SQL_LOGIN | WINDOWS_LOGIN | WINDOWS_GROUP | ...) | NA |  |  |
| `is_disabled` | Login Disabled (0/1: 1 = disabled) | BOOLEAN |  |  |
| `create_date` | Created | NA |  |  |
| `modify_date` | Modified | NA |  |  |
| `default_database_name` | Default Database | NA |  |  |
| `default_language_name` | Default Language | NA |  |  |

### Database Users (`User`) - collected every 60 Min

Database-level principals per database - type, whether it is a system user, creation date, default schema, and authentication type.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database | NA |  |  |
| `name` (key) | User Name | NA |  |  |
| `type_desc` | User Type (SQL_USER | WINDOWS_USER | WINDOWS_GROUP | ...) | NA |  |  |
| `is_system` | System Object (0/1: 1 = system user) | BOOLEAN |  |  |
| `create_date` | Created | NA |  |  |
| `default_schema_name` | Default Schema | NA |  |  |
| `authentication_type_desc` | Authentication Type (NONE | INSTANCE | DATABASE | WINDOWS) | NA |  |  |

### SQL Server Agent Status (`AgentStatus`) - collected every 5 Min

SQL Server Agent service state - the running status, start mode, last startup time, and the service account. Collected on a short schedule because an Agent that is not running silently stops every scheduled job.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `server_name` | Server Name | NA |  |  |
| `service_name` (key) | Service Name | NA |  |  |
| `process_id` | Process ID | NA |  |  |
| `service_path` | Service Path | NA |  |  |
| `agent_status` | Agent Status (Running | Stopped | Paused | ...) | NA |  |  |
| `agent_start_mode` | Start Mode | NA |  |  |
| `last_startup_time` | Last Startup Time | NA |  |  |
| `service_account` | Service Account | NA |  |  |

### License (`License`) - collected every 60 Min

Licence state of this plug-in installation, not of the SQL Server instance - the collection contacts neither the database nor the OMS. license_status carries the reason (Active, Expired, Wrong Product, Invalid Signature, License Required, Exceeded Limit, Instance Count Unavailable); the threshold is set on days_remaining, which is only a real countdown for Active and Expired.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `customer` (key) | Customer | NA |  |  |
| `license_type` | License Type | NA |  |  |
| `expiration` | Expiration | NA |  |  |
| `instances` | Licensed Instances | NA |  |  |
| `days_remaining` | Days Remaining (36500 = no countdown; see License Status) | days | < 30 | < 7 |
| `license_status` | License Status (Active | Expired | License Required | ...) | NA |  |  |

### Collector Status (`CollectorStatus`) - collected every 5 Min

Why each metric group of this target is empty or failing, one row per group, so an empty group can be told apart from a feature that is not set up, a group that has not run yet and a collection that is failing. Status is one word from a closed set shared with the other Integration Plumbers plug-ins - OK, NOT_CONFIGURED, NOT_COLLECTED_YET, NO_DATA, COLLECTION_ERROR, DISABLED - with the reason in plain text, the rows the last run returned, and the last attempt as LastAttemptEpoch, UTC seconds since 1970, blank for a group that has never run. LastAttempt is retired and always blank: as a timestamp string it changed on every run and filled the repository's string history. The critical alert fires when a group still reads COLLECTION_ERROR after two consecutive 5-minute checks and clears on the group's next successful run. See the user guide, chapter 9.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `MetricGroup` (key) | Metric Group This Row Describes | NA |  |  |
| `Status` | Status (OK | NOT_CONFIGURED | NOT_COLLECTED_YET | NO_DATA | ...) | NA | MATCH NotDefined | MATCH COLLECTION_ERROR |
| `Reason` | Reason for the Status (plain text; error if COLLECTION_ERROR) | NA |  |  |
| `LastAttempt` | Last Collection Attempt (retired, always blank) | NA |  |  |
| `RowsReturned` | Rows Returned by the Last Collection Attempt (count) | NA |  |  |
| `LastAttemptEpoch` | Last Collection Attempt (Unix epoch seconds; blank/0 = never) | NA |  |  |

### SQL Server Agent Jobs (`DatabaseJob`) - collected every 60 Min

SQL Server Agent job definitions and outcomes from msdb - whether the job is enabled, its owner and category, the step count, and the last run's date, time and outcome. has_run is 1 once the job has run and 0 before; the date and time are blank until then.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `job_id` (key) | Job ID | NA |  |  |
| `name` | Job Name | NA |  |  |
| `enabled` | Job Enabled (0/1: 1 = enabled) | BOOLEAN |  |  |
| `description` | Job Description | NA |  |  |
| `owner` | Owner | NA |  |  |
| `category` | Category | NA |  |  |
| `date_created` | Created | NA |  |  |
| `date_modified` | Modified | NA |  |  |
| `version_number` | Version | NA |  |  |
| `last_run_date` | Last Run Date (yyyymmdd; blank if Has Run = 0) | NA |  |  |
| `last_run_time` | Last Run Time (hhmmss; blank if Has Run = 0) | NA |  |  |
| `last_run_outcome` | Run Outcome (0=fail, 1=ok, 3=cancel, 5=unknown/never, -1=none) | NA |  |  |
| `number_of_steps` | Number of Steps | NA |  |  |
| `has_run` | Has Run (0/1: 1 = ran at least once) | BOOLEAN |  |  |

### Error Log Entries (`ErrorLog`) - collected every 15 Min

Recent SQL Server error log entries with their timestamp and process context. Keyed by timestamp and sequence so repeated messages in the same second stay distinct. log_epoch carries the timestamp as seconds since 1970 on the server's clock.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `log_date` (key) | Log Date | NA |  |  |
| `process_info` | Process Info | NA |  |  |
| `error_text` | Error Log Message | NA |  |  |
| `seq` (key) | Sequence | NA |  |  |
| `log_epoch` | Log Time (seconds since 1970, server clock) | NA |  |  |

### SQL Instance Statistics (`SqlInstanceStats`) - collected every 60 Min

Instance-wide size rollup - database counts and the combined data, log and total file sizes across every database.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `combined_file_size_mb` | Combined File Size (MB) | MB |  |  |
| `number_of_databases` | Number of Databases | NA |  |  |
| `number_of_user_databases` | Number of User Databases | NA |  |  |
| `combined_data_size_mb` | Combined Data Size (MB) | MB |  |  |
| `combined_log_size_mb` | Combined Log Size (MB) | MB |  |  |

### Deadlock Rate (`DeadlockRate`) - collected every 15 Min

Deadlock counts from the system_health extended-events session - the trailing hour and day, the total in the current file, and how long since the last one. The hourly count carries a threshold.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `deadlocks_last_hour` | Deadlocks (Last Hour) | NA | > 5 | > 20 |
| `deadlocks_last_day` | Deadlocks (Last 24h) | NA |  |  |
| `deadlocks_in_file` | Deadlocks (In Event File) | NA |  |  |
| `minutes_since_last_deadlock` | Minutes Since Last Deadlock (blank if In Event File = 0) | MINUTES |  |  |

### Recent Deadlocks (`RecentDeadlocks`) - collected every 15 Min

The recent deadlock list parsed out of the system_health event file - event time, how many processes and resources took part, and the victim's identifiers. One row per deadlock graph.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `event_time_utc` (key) | Deadlock Time (UTC) | NA |  |  |
| `process_count` | Processes | NA |  |  |
| `resource_count` | Resources | NA |  |  |
| `victim_process_id` | Victim Process | NA |  |  |
| `victim_spid` | Victim SPID | NA |  |  |
| `victim_database_name` | Victim Database | NA |  |  |

### Blocked Sessions (`BlockedSessions`) - collected every 5 Min

The current count of blocked requests as a single number, collected on a short schedule so it can be alerted on and charted. Carries a threshold.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `blocked_sessions` | Blocked Sessions | NA | > 5 | > 20 |

### Connection Saturation (`ConnectionSaturation`) - collected every 5 Min

User connections as a percentage of the instance's effective connection cap, so the alert fires on the ratio rather than on a raw count that means different things on different instances.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `user_connections` | User Connections | NA |  |  |
| `max_connections` | Max Connections | NA |  |  |
| `connection_saturation_pct` | Connection Saturation (%) | PERCENTAGE | > 80 | > 90 |

### TempDB Contention (`TempdbContention`) - collected every 5 Min

TempDB PAGELATCH contention with the page type classified by the engine rather than guessed from the page number - total and exclusive-mode waiters, the allocation-page (PFS/GAM/SGAM) and metadata-page splits, the longest current wait, and a plain-language advice string. The allocation and metadata splits require DMVs added in SQL Server 2019 and report zero on 2016 and 2017; read those zeros as not-classifiable-here rather than as nothing-to-report.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `pagelatch_waiters` | PAGELATCH Waiters | NA |  |  |
| `pagelatch_ex_waiters` | PAGELATCH_EX Waiters | NA | > 5 | > 20 |
| `allocation_page_waiters` | Allocation-Page Waiters (PFS/GAM/SGAM) | NA |  |  |
| `metadata_page_waiters` | Metadata-Page Waiters | NA |  |  |
| `max_wait_ms` | Max Wait (ms) | MILLISECONDS |  |  |
| `advice` | Advice | NA |  |  |

### Worst Query CPU (`WorstQueryCpu`) - collected every 15 Min

Instance-wide worst-query costs as one numeric row per collection, which is what the Current Queries page history chart is drawn from. The three CPU columns are each the maximum of their own measure, so they may describe different statements; use the tables on that page to identify which.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `worst_query_cpu_ms` | Worst Query CPU, Cumulative While Cached (ms) | MILLISECONDS |  |  |
| `worst_query_avg_cpu_ms` | Worst Query CPU per Execution (ms) | MILLISECONDS |  |  |
| `worst_query_max_cpu_ms` | Worst Query CPU, Slowest Execution (ms) | MILLISECONDS |  |  |
| `cached_statements` | Cached Statements | NA |  |  |
| `cached_executions` | Cached Executions | NA |  |  |

### Associated Services (`AssociatedServices`) - collected every 5 Min

The services this SQL Server instance reports - the running status, start mode, process id and service account for each. On Windows this is the database engine, the Agent and the Full-text Filter Daemon Launcher; on Linux only the Agent is reported. Services that belong to Windows rather than to SQL Server, such as the Browser and the VSS Writer, are not included.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `service_name` (key) | Service | NA |  |  |
| `service_status` | Service Status (Running | Stopped | Paused | ...) | NA |  |  |
| `start_mode` | Start Mode | NA |  |  |
| `process_id` | Process ID | NA |  |  |
| `service_account` | Service Account | NA |  |  |
| `last_startup_time` | Last Startup Time | NA |  |  |
| `service_path` | Service Path | NA |  |  |

### Database Composition (`DatabaseComposition`) - collected every 24 Hr

What each database's space is actually holding, rather than how full it is: data, indexes, reserved-but-unused and unallocated space, plus the transaction log used and its size. The page arithmetic is sp_spaceused's own, so the figures match what SQL Server reports directly.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `data_kb` | Data (KB) | KB |  |  |
| `index_kb` | Indexes (KB) | KB |  |  |
| `unused_kb` | Reserved but Unused (KB) | KB |  |  |
| `unallocated_kb` | Unallocated (KB) | KB |  |  |
| `log_used_kb` | Transaction Log Used (KB) | KB |  |  |
| `log_allocated_kb` | Transaction Log Size (KB) | KB |  |  |

### Security Update Status (`SecurityUpdateStatus`) - collected every 60 Min

The instance's build against Microsoft's security updates for its version and servicing path (CU or GDR), from a reference table shipped with the plug-in and refreshed each release - reference_as_of says how current it is, and a Current verdict more than 45 days past it reads Reference Stale. required_build and required_update name the latest release to install; days_behind counts from the OLDEST security release the instance lacks, which oldest_missed_update and oldest_missed_release_date name, and carries the threshold (Warning 30, Critical 90). For a build older than every release in the table the count starts at the table's first release, so it is a minimum and oldest_missed_update says or earlier. days_behind and security_update_missing are blank for a version outside the table rather than reading as patched; version_judged is always 0 or 1, so a reader that turns a blank number into 0 (the EM MCP server does) can still tell an unjudged version from a patched one. SQL Server 2016 reports its final July 2026 updates and, once applied, Final Update Applied, Out of Support.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `product_version` | Product Version | NA |  |  |
| `product_level` | Product Level | NA |  |  |
| `product_update_level` | Installed Update | NA |  |  |
| `product_update_reference` | Installed Update KB | NA |  |  |
| `servicing_path` | Servicing Path | NA |  |  |
| `security_status` | Security Update Status | NA |  |  |
| `required_build` | Required Build | NA |  |  |
| `required_update` | Latest Security Update | NA |  |  |
| `required_release_date` | Latest Security Update Released | NA |  |  |
| `security_update_missing` | Security Update Missing (0/1: 1 = behind latest) | BOOLEAN |  |  |
| `days_behind` | Days Since Oldest Missed Security Update | days | >= 30 | >= 90 |
| `reference_as_of` | Reference Data As Of | NA |  |  |
| `oldest_missed_update` | Oldest Missed Security Update | NA |  |  |
| `oldest_missed_release_date` | Oldest Missed Security Update Released | NA |  |  |
| `version_judged` | Version Judged (0/1: 0 = not in the reference table) | BOOLEAN |  |  |

### Query Store Status (`QueryStoreStatus`) - collected every 60 Min

Which user databases Query Store covers, from sys.database_query_store_options - the actual and requested state, capture mode, statistics interval, retention, storage used against the maximum, and the number of queries and plans held. actual_state is 0 off, 1 read-only, 2 read-write. The Query Store groups read only databases where it is not 0; the plan-cache groups above cover every database regardless. Empty before SQL Server 2016.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `actual_state` | Query Store State (0 = off, 1 = read-only, 2 = read-write) | NA |  |  |
| `actual_state_desc` | Query Store State (OFF | READ_ONLY | READ_WRITE | ERROR) | NA |  |  |
| `desired_state_desc` | Requested State (OFF | READ_ONLY | READ_WRITE) | NA |  |  |
| `readonly_reason` | Read-Only Reason (code, 0 = not read-only) | NA |  |  |
| `capture_mode_desc` | Capture Mode (ALL | AUTO | NONE | CUSTOM) | NA |  |  |
| `stats_interval_minutes` | Statistics Interval Length (minutes) | MINUTES |  |  |
| `stale_days` | Retention (days, stale query threshold) | DAYS |  |  |
| `max_size_mb` | Maximum Store Size (MB) | MB |  |  |
| `used_size_mb` | Store Size Used (MB) | MB |  |  |
| `flush_seconds` | Flush Interval (seconds) | SECOND |  |  |
| `query_count` | Queries in Store (count, 0 when off) | NA |  |  |
| `plan_count` | Plans in Store (count, 0 when off) | NA |  |  |

### Query Store Plan Statistics per Interval (`QueryStorePlanStats`) - collected every 15 Min

Per-interval runtime statistics per plan read from Query Store - executions, aborted executions, CPU, duration and reads per closed Query Store interval, so history survives plan-cache eviction and restarts. Each closed interval is stored exactly once (each run reads the intervals that closed since the previous run, on the server's clock), so sums over any range are exact; the first collection, and the first after the cache file is lost, stores nothing and starts the window, so no interval is stored twice. Top 300 (query, plan) pairs by CPU per interval; the plug-in's own collection statements are excluded. Most 15-minute collections are empty, because rows arrive only when an interval closes (60 minutes by default). Epochs are UTC seconds.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `query_id` (key) | Query Store Query ID | NA |  |  |
| `plan_id` (key) | Query Store Plan ID | NA |  |  |
| `interval_start_epoch` (key) | Interval Start (Interval key, UTC seconds since 1970) | NA |  |  |
| `interval_minutes` | Interval Length | MINUTES |  |  |
| `executions` | Executions in Interval (completed normally) | NA |  |  |
| `aborted_executions` | Aborted or Failed Executions in Interval | NA |  |  |
| `total_cpu_us` | CPU in Interval (us, all executions) | MICROSEC |  |  |
| `total_duration_us` | Duration in Interval (us, all executions) | MICROSEC |  |  |
| `total_logical_reads` | Logical Reads in Interval (pages) | NA |  |  |
| `total_physical_reads` | Physical Reads in Interval (pages) | NA |  |  |
| `avg_cpu_us` | Avg CPU per Execution in Interval (us) | MICROSEC |  |  |
| `max_cpu_us` | Max CPU of One Execution in Interval (us) | MICROSEC |  |  |
| `is_forced_plan` | Forced Plan (0/1: 1 = plan is forced) | BOOLEAN |  |  |
| `query_hash` | Query Hash (same format as Top Queries) | NA |  |  |
| `object_name` | Module (schema.name; empty for ad hoc SQL) | NA |  |  |
| `first_execution_epoch` | First Execution in Interval (UTC seconds since 1970) | NA |  |  |
| `last_execution_epoch` | Last Execution in Interval (UTC seconds since 1970) | NA |  |  |
| `query_text` | Query Text (Query Store statement text) | NA |  |  |

### Query Store Plan Regression (`QueryStoreRegression`) - collected every 15 Min

Plan regression from Query Store - for each query that ran under more than one plan, its current plan (most recently executed, averaged over the last 24 hours) against its previous plan (the next most recently executed, averaged over Query Store's retention), with the ratio of their average CPU per execution and of their logical reads. cpu_ratio carries the ships-enabled alert (Warning 2, Critical 5); -1 means no ratio and never alerts: the current plan has under 10 executions in the last 24 hours or averages under 1 ms of CPU, or the previous plan has under 10. Every execution type counts, timed-out runs included. A query that stops running keeps its row at -1 for 7 days, so an open incident clears. A query that goes back to a better plan reads below 1 and clears; when Query Store forgets the previous plan the row disappears, and an incident still open on it must be cleared by hand.

| Column | Label | Unit | Warning | Critical |
|---|---|---|---|---|
| `database_name` (key) | Database Name | NA |  |  |
| `query_id` (key) | Query Store Query ID | NA |  |  |
| `plan_count` | Plans with Executions in Query Store (count) | NA |  |  |
| `current_plan_id` | Current Plan ID (most recently executed) | NA |  |  |
| `previous_plan_id` | Previous Plan ID (executed before the current one) | NA |  |  |
| `current_avg_cpu_us` | Current Plan Avg CPU per Execution (us, last 24 h) | MICROSEC |  |  |
| `previous_avg_cpu_us` | Previous Plan Avg CPU per Execution (us) | MICROSEC |  |  |
| `cpu_ratio` | CPU Ratio (current / previous avg; -1 = previous was 0) | NA | >= 2 | >= 5 |
| `reads_ratio` | Logical Reads Ratio (current / previous; -1 = previous 0) | NA |  |  |
| `current_executions` | Current Plan Executions (last 24 h) | NA |  |  |
| `previous_executions` | Previous Plan Executions (Query Store retention) | NA |  |  |
| `current_first_seen_epoch` | Current Plan First Seen (UTC seconds since 1970) | NA |  |  |
| `is_forced_plan` | Current Plan Forced (0/1: 1 = plan is forced) | BOOLEAN |  |  |
| `query_hash` | Query Hash (same format as Top Queries) | NA |  |  |
| `query_text` | Query Text (first 500 characters) | NA |  |  |
