MCP Hub
Back to servers

PerformanceMonitor

Free, open-source SQL Server performance monitoring. Full Edition (server-installed, 30 collectors) and Lite Edition (standalone, DuckDB). Built-in MCP server for AI integration.

GitHub
Stars
216
Forks
22
Updated
Mar 5, 2026
Validated
Mar 6, 2026

SQL Server Performance Monitor

Free, open-source monitoring that replaces the tools charging you thousands per server per year. 30+ collectors, real-time alerts, built-in MCP server for AI analysis. Nothing phones home. Your data stays on your server and your machine.

Supported: SQL Server 2016–2025 | Azure SQL Managed Instance | AWS RDS for SQL Server | Azure SQL Database (Lite only)

Dashboard landing page with server health cards

Full Dashboard — Resource Overview


Download

👉 Not sure which edition to pick? Start with Lite. One download, nothing installed on your server, data flowing in under 5 minutes.

Full EditionLite Edition
What it doesInstalls a PerformanceMonitor database with 30 T-SQL collectors running via SQL Agent. Separate dashboard app connects to view everything.Single desktop app that monitors remotely. Stores data locally in DuckDB + Parquet. Nothing touches your server.
Best forProduction 24/7 monitoring, long-term baseliningQuick triage, Azure SQL DB, locked-down servers, consultants, firefighting
Requiressysadmin + SQL Agent runningVIEW SERVER STATE (that's it)
Get startedRun the installer, open the dashboardDownload, run, add a server, done

Both editions include real-time alerts (system tray + email), charts and graphs, dark and light themes, CSV export, and a built-in MCP server for AI-powered analysis with tools like Claude.


What People Are Saying

"You guys make us DBAs look like absolute rockstars. I'm over here getting showered with praise, and all I do is use your scripts and follow your advice."

"replaced SentryOne and had it running in 10 minutes"

"I've had enough time to gather data and converse with Claude on this. It helped a lot to zone in on CPU starvation from the hypervisor on which the VM runs. IT team currently investigating the host configuration."


What You Get

🔍 32 specialized T-SQL collectors running on configurable schedules — wait stats, query performance, blocking chains, deadlock graphs, memory grants, file I/O, tempdb, perfmon counters, and more. Query text and execution plan collection can be disabled per-collector for sensitive environments.

🚨 Real-time alerts for blocking, deadlocks, and high CPU — system tray notifications plus styled HTML emails with full XML attachments for offline analysis

📊 NOC-style dashboard with green/yellow/red health cards, auto-refresh, configurable time ranges, and dark/light themes

📋 Graphical plan viewer with native ShowPlan rendering, 30-rule PlanAnalyzer, operator-level cost breakdown, and a standalone mode for opening .sqlplan files without a server connection

🤖 Built-in MCP server with 27-31 read-only tools for AI analysis — ask Claude Code or Cursor "what are the top wait types on my server?" and get answers from your actual monitoring data

🧰 Community tools installed automatically — sp_WhoIsActive, sp_BlitzLock, sp_HealthParser, sp_HumanEventsBlockViewer

🔒 Your data never leaves — no telemetry, no cloud dependency, no phoning home. Credentials stored in Windows Credential Manager with OS-level encryption.


More Screenshots

Lite Edition — Query Performance

Lite Edition — Query Performance

Graphical Plan Viewer

Graphical plan viewer with missing index suggestions and operator analysis

Alert Notifications

Alert notification

MCP Server — AI-Powered Analysis

MCP server analysis


Quick Start — Lite Edition

  1. Download and extract PerformanceMonitorLite (requires .NET 8 Desktop Runtime)
  2. Run PerformanceMonitorLite.exe
  3. Click + Add Server, enter connection details, test, save
  4. Double-click the server in the sidebar to connect

Data starts flowing within 1–5 minutes. That's it. No installation on your server, no Agent jobs, no sysadmin required.

Lite Collectors

20 collectors run on independent, configurable schedules:

CollectorDefaultSource
query_snapshots1 minsys.dm_exec_requests + sys.dm_exec_sessions
blocked_process_report1 minXE ring buffer session
waiting_tasks1 minsys.dm_os_waiting_tasks
wait_stats1 minsys.dm_os_wait_stats (deltas)
query_stats1 minsys.dm_exec_query_stats (deltas)
procedure_stats1 minsys.dm_exec_procedure_stats (deltas)
cpu_utilization1 minsys.dm_os_ring_buffers scheduler monitor
file_io_stats1 minsys.dm_io_virtual_file_stats (deltas)
memory_stats1 minsys.dm_os_sys_memory + memory counters
memory_grant_stats1 minsys.dm_exec_query_memory_grants
tempdb_stats1 minsys.dm_db_file_space_usage
perfmon_stats1 minsys.dm_os_performance_counters (deltas)
deadlocks1 minsystem_health Extended Events session
memory_clerks5 minsys.dm_os_memory_clerks
query_store5 minQuery Store DMVs (per database)
running_jobs5 minmsdb job history with duration vs avg/p95
server_configOn connectsys.configurations
database_configOn connectsys.databases
database_scoped_configOn connectDatabase-scoped configurations
trace_flagsOn connectDBCC TRACESTATUS

Lite Data Storage

  • Hot data in DuckDB (7–90 days, configurable)
  • Archive to Parquet with ZSTD compression (~10x reduction, 30–180 days configurable)
  • Typical size: ~50–200 MB per server per week

Lite Configuration

All configuration lives in the config/ folder:

FilePurpose
servers.jsonServer connections (passwords in Windows Credential Manager)
settings.jsonRetention, MCP server, startup behavior, alert thresholds, SMTP configuration
collection_schedule.jsonPer-collector enable/disable and frequency
ignored_wait_types.json144 benign wait types excluded by default

Quick Start — Full Edition

Install

Windows Authentication:

PerformanceMonitorInstaller.exe YourServerName

SQL Authentication:

PerformanceMonitorInstaller.exe YourServerName sa YourPassword

Clean reinstall (drops existing database and all collected data):

PerformanceMonitorInstaller.exe YourServerName --reinstall
PerformanceMonitorInstaller.exe YourServerName sa YourPassword --reinstall

The installer automatically tests the connection, executes SQL scripts, downloads community dependencies, creates SQL Agent jobs, and runs initial data collection. A GUI installer (InstallerGui/) is also available with the same functionality.

CLI Installer Options

OptionDescription
SERVERSQL Server instance name (positional, required)
USERNAME PASSWORDSQL Authentication credentials (positional, optional)
--reinstallDrop existing database and perform clean install
--preserve-jobsKeep existing SQL Agent job schedules during upgrade
--encrypt=optional|mandatory|strictConnection encryption level (default: mandatory)
--trust-certTrust server certificate without validation (default: require valid cert)
--helpShow usage information and exit

Environment variable: Set PM_SQL_PASSWORD to avoid passing the password on the command line.

Exit Codes

CodeMeaning
0Success
1Invalid arguments
2Connection failed
3Critical file failed (scripts 01–03)
4Partial installation (non-critical failures)
5Version check failed
6SQL files not found

Post-Installation

  1. Ensure SQL Server Agent is running — the collection job executes every minute
  2. Verify installation:
SELECT * FROM PerformanceMonitor.config.current_version;

SELECT TOP (20) *
FROM PerformanceMonitor.config.collection_log
ORDER BY collection_time DESC;
  1. Launch the Dashboard (Dashboard/ folder — build with dotnet build or use the release package). The Dashboard is a separate WPF application that runs on your workstation and connects to any SQL Server where the PerformanceMonitor database is installed. Add your server, enter credentials, and data appears immediately.

What Gets Installed

  • PerformanceMonitor database with collection tables and reporting views
  • 32 collector stored procedures for gathering metrics (including SQL Agent job monitoring)
  • Configurable collection — query text and execution plan capture can be disabled per-collector via config.collection_schedule (collect_query, collect_plan columns) for sensitive or high-volume environments
  • Delta framework for calculating per-second rates from cumulative DMVs
  • Community dependencies: sp_WhoIsActive, sp_HealthParser, sp_HumanEventsBlockViewer, sp_BlitzLock
  • SQL Agent jobs: Collection (every 1 minute), Data Retention (daily at 2:00 AM), and Hung Job Monitor (collection job watchdog, every 5 minutes)
  • Version tracking in config.installation_history

Data Retention

Default: 30 days (configurable per table in config.retention_settings).

Storage estimates: 5–10 GB per week, 20–40 GB per month.

Managed Platform Support

The Full Edition supports Azure SQL Managed Instance and AWS RDS for SQL Server with some limitations:

FeatureOn-PremisesAzure SQL MIAWS RDS
All core collectorsYesYesYes
Default trace collectorsYesDisabled automaticallyYes
System health XE (file target)YesDisabled automaticallyYes
SQL Trace collectorsYesDisabled automaticallyYes
SQL Agent jobsYesYesYes
Running jobs collectorYesYesDisabled automatically
Blocked process thresholdAuto-configuredAuto-configuredConfigure via RDS parameter group
sp_configureYesYesNot available

Azure SQL MI: The installer automatically detects Engine Edition 8 and disables 4 collectors that require file system access or SQL Trace (default_trace, trace_management, trace_analysis, system_health). All other collectors work normally.

AWS RDS: The installer automatically detects the rdsadmin database and disables the running_jobs_collector (requires msdb.dbo.syssessions which is restricted on RDS). It also gracefully handles restricted sp_configure and limited msdb permissions. SQL Agent jobs are created and owned by the installing login. The RDS master user is automatically enrolled in SQLAgentUserRole; for other logins, add them to SQLAgentUserRole in msdb before running the installer.

AWS RDS Parameter Group Configuration

sp_configure is not available on AWS RDS for SQL Server. Features that depend on server-level configuration must be set through AWS RDS Parameter Groups instead.

Blocked process threshold — Required for blocked process report collection. Without this, blocked process reports will not fire on RDS.

  1. Open the AWS RDS Console and navigate to Parameter groups

  2. Create a new parameter group (or modify the one attached to your instance):

    • Family: sqlserver-ee-16.0 (or your edition/version)
    • Type: DB Parameter Group
  3. Search for blocked process threshold (s) and set it to 5 (seconds)

  4. Apply the parameter group to your RDS instance (may require a reboot if the parameter is static)

  5. Verify it took effect:

    SELECT
        c.name,
        c.value_in_use
    FROM sys.configurations AS c
    WHERE c.name = N'blocked process threshold (s)';
    

Deadlocks — No parameter group configuration is required. The SQL Server deadlock monitor runs automatically on all platforms, and the xml_deadlock_report Extended Event fires without any threshold setting.

Azure SQL Database — The blocked process threshold is fixed at 20 seconds and cannot be changed. The blocked_process_report event fires automatically when blocking exceeds this duration.


Edition Comparison

CapabilityFullLite
Target server installationRequiredNone
SQL Server AgentRequiredNot needed
Azure SQL Managed InstanceSupportedSupported
AWS RDS for SQL ServerSupportedSupported
Azure SQL DatabaseNot supportedSupported
Multi-server from one seatPer-server installBuilt-in
Collectors3220
Agent job monitoringDuration vs historical avg/p95Duration vs historical avg/p95
Data storageSQL Server (on target)DuckDB + Parquet (local)
Execution plansCollected and stored (can be disabled per-collector)Download on demand
Graphical plan viewerBuilt-in with 30-rule PlanAnalyzerBuilt-in with 30-rule PlanAnalyzer
Standalone plan viewerOpen/paste/drag .sqlplan filesOpen/paste/drag .sqlplan files
Community tools (sp_WhoIsActive, sp_BlitzLock)Installed automaticallyNot needed
Alerts (tray + email)Blocking, deadlocks, CPUBlocking, deadlocks, CPU
DashboardSeparate appBuilt-in
ThemesDark and lightDark and light
PortabilityServer-boundSingle executable
MCP server (LLM integration)Built into Dashboard (27 tools)Built-in (31 tools)

Dashboard Tabs

Full Edition Dashboard

TabContents
OverviewResource overview, daily summary, critical issues, server config changes, database config changes, trace flag changes, collection health
PerformancePerformance trends, expensive queries, active queries, query stats, procedure stats, Query Store, Query Store regressions, query trace patterns
Resource MetricsServer trends, wait stats, TempDB, file I/O latency, perfmon counters, default trace events, trace analysis, session stats, latch stats, spinlock stats
MemoryMemory overview, grants, clerks, plan cache, memory pressure events
LockingBlocking chains, deadlocks, blocking/deadlock trends
System EventsCorruption events, contention, errors, I/O issues, scheduler issues, memory conditions

Plus a NOC-style landing page with server health cards (green/yellow/red severity indicators).

Lite Edition Dashboard

TabContents
Active QueriesRunning queries with session details, wait types, blocking, DOP, memory grants
Wait StatsFilterable wait statistics chart with delta calculations
CPUSQL Server CPU vs Other Processes over time
MemoryPhysical memory overview, SQL Server memory trend, memory clerk breakdown
QueriesPerformance trends, top queries and procedures by duration, Query Store integration
File I/ORead/write I/O trends per database file
TempDBSpace usage breakdown and TempDB file I/O
BlockingBlocking/deadlock trends, blocked process reports, deadlock history
PerfmonSelectable SQL Server performance counters over time
ConfigurationServer configuration, database configuration, scoped configuration, trace flags

Both editions feature auto-refresh, configurable time ranges, right-click CSV export, system tray integration, dark and light themes, and timezone display options (server time, local time, or UTC).


Alerts & Notifications

Both editions include a real-time alert engine that monitors for performance issues and sends notifications via system tray balloons and email.

Alert Types

MetricDefault ThresholdDescription
Blocking30 seconds (Full), 5 seconds (Lite)Fires when the longest blocked session exceeds the threshold
Deadlocks1Fires when new deadlocks are detected since the last check
High CPU90% (Full), 80% (Lite)Fires when total CPU (SQL + other) exceeds the threshold
Connection changesN/AFires when a monitored server goes offline or comes back online

All thresholds are configurable in Settings.

Notification Channels

  • System tray — balloon notifications with 5-minute per-metric cooldown
  • Email (SMTP) — styled HTML emails with 15-minute per-metric cooldown, configurable SMTP settings (server, port, SSL, authentication, recipients)

Email Alerts

Alert emails include:

  • Metric summary — what triggered the alert, current value vs threshold
  • Detail section — recent blocking chains or deadlock participants with query text, wait times, lock modes, database names, and client application
  • XML attachment — full blocked_process_report.xml or deadlock_graph.xml for offline analysis

Alert Behavior

  • Resolved notifications — when a condition clears (e.g., blocking ends), a "Cleared" notification fires
  • Server silencing — right-click a server tab to acknowledge alerts, silence all alerts, or unsilence
  • Always-on — the Dashboard alert engine runs independently of which tab is active, including when minimized to the system tray. The Lite edition's alert engine also runs regardless of tab visibility.
  • Alert history — Dashboard keeps an in-memory alert log (accessible via MCP). Lite logs alerts to DuckDB (config_alert_log).

Agent Job Monitoring

Both editions monitor currently running SQL Agent jobs and flag jobs that are running longer than expected.

MetricHow It Works
Current durationElapsed time since the job started
Average durationHistorical mean from successful completions in msdb.dbo.sysjobhistory
p95 duration95th percentile from historical completions
Running long flagSet when current duration exceeds the p95 threshold

The Full Edition collects this data via the collect.running_jobs_collector stored procedure (every 5 minutes). The Lite Edition queries msdb directly on each collection cycle. Both editions expose this data through the MCP get_running_jobs tool.

Gracefully skipped on Azure SQL Database, AWS RDS for SQL Server, and environments without SQL Server Agent.


MCP Server (LLM Integration)

Both editions include an embedded Model Context Protocol server that exposes monitoring data to LLM clients like Claude Code and Cursor.

Setup

  1. Enable the MCP server in Settings (checkbox + port, default 5151)
  2. Register with Claude Code:
claude mcp add --transport http --scope user sql-monitor http://localhost:5151/
  1. Open a new Claude Code session and ask questions like:
    • "What servers are being monitored?"
    • "What are the top wait types on my server?"
    • "Are there any blocking or deadlock issues?"
    • "Show me CPU utilization for the last 4 hours"
    • "What are the most expensive queries by CPU?"

Available Tools

Full Edition exposes 27 tools, Lite Edition exposes 31. Core tools are shared across both editions.

CategoryTools
Discoverylist_servers
Healthget_server_summary*, get_daily_summary**, get_collection_health
Alertsget_alert_history, get_alert_settings
Waitsget_wait_stats, get_wait_types*, get_wait_trend, get_waiting_tasks*
Queriesget_top_queries_by_cpu, get_top_procedures_by_cpu, get_query_store_top, get_expensive_queries**, get_query_duration_trend*, get_query_trend
CPUget_cpu_utilization
Memoryget_memory_stats, get_memory_trend, get_memory_clerks, get_memory_grants
Blockingget_blocking**, get_deadlocks, get_deadlock_detail, get_blocked_process_reports*, get_blocked_process_xml, get_blocking_deadlock_stats**, get_blocking_trend*, get_deadlock_trend*
I/Oget_file_io_stats, get_file_io_trend
TempDBget_tempdb_trend
Perfmonget_perfmon_stats, get_perfmon_trend
Jobsget_running_jobs*

* Lite only | ** Full only

Most tools accept optional server_name and hours_back parameters. If only one server is configured, server_name is auto-resolved.

The MCP server binds to localhost only and does not accept remote connections.


Performance Impact

On Monitored Servers

  • All queries use READ UNCOMMITTED isolation
  • Configurable collection intervals
  • Full Edition: typical overhead <1% CPU, <100 MB memory
  • Lite Edition: max 7 concurrent SQL connections, 30-second command timeout

Local Resources (Lite)

  • DuckDB: ~50–200 MB per server per week
  • Parquet archives: ~10x compression with ZSTD
  • ScottPlot charts use hardware-accelerated rendering

Troubleshooting

Full Edition

Two diagnostic scripts in the install/ folder:

ScriptPurpose
99_installer_troubleshooting.sqlQuick health checks: collection log errors, schedule status, Agent job status, table row counts
99_user_troubleshooting.sqlComprehensive diagnostics: runs collectors with @debug = 1, detailed timing and row counts
SELECT
    collection_time,
    collector_name,
    error_message
FROM PerformanceMonitor.config.collection_log
WHERE collection_status = 'ERROR'
ORDER BY collection_time DESC;

Lite Edition

Application logs are written to the logs/ folder. Collection success/failure is also logged to the collection_log table in DuckDB.

Common issues:

  1. No data after connecting — Wait for the first collection cycle (1–5 minutes). Check logs for connection errors.
  2. Query Store tab empty — Query Store must be enabled on the target database (ALTER DATABASE [YourDB] SET QUERY_STORE = ON).
  3. Blocked process reports empty — Both editions attempt to auto-configure the blocked process threshold to 5 seconds via sp_configure. On AWS RDS, sp_configure is not available — you must set blocked process threshold (s) through an RDS Parameter Group (see "AWS RDS Parameter Group Configuration" above). On Azure SQL Database, the threshold is fixed at 20 seconds and cannot be changed. If you still see no data on other platforms, verify the login has ALTER SETTINGS permission.
  4. Connection failures — Verify network connectivity, firewall rules, and that the login has VIEW SERVER STATE.

Folder Structure

Monitor/
│
│   Full Edition (server-installed collectors + separate dashboard)
├── install/          # 54 SQL installation scripts
├── upgrades/         # Version-specific upgrade scripts
├── Installer/        # CLI installer for Full Edition database (C#)
├── InstallerGui/     # GUI installer for Full Edition database (WPF)
├── Dashboard/        # Full Edition dashboard application (WPF)
│
│   Lite Edition (standalone desktop app, nothing installed on server)
├── Lite/             # Lite Edition desktop application (WPF)
│
│   Shared
└── README.md         # This file

Building from Source

All projects target .NET 8.0.

# Full Edition Dashboard
dotnet build Dashboard/Dashboard.csproj

# Lite Edition
dotnet build Lite/PerformanceMonitorLite.csproj

# CLI Installer (self-contained)
dotnet publish Installer/PerformanceMonitorInstaller.csproj -c Release

# GUI Installer
dotnet publish InstallerGui/InstallerGui.csproj -c Release -r win-x64 --self-contained

Support & Sponsorship

This project is free and open source. If you find it valuable, consider supporting continued development:

Sponsor on GitHubBecome a sponsor to fund new features, ongoing maintenance, and SQL Server version support.
Consulting ServicesHire me for hands-on consulting if you need help analyzing the data this tool collects? Want expert assistance fixing the issues it uncovers?

Neither is required — use the tool freely. Sponsorship and consulting keep this project alive.


Third-Party Components

sp_WhoIsActive

DarlingData

SQL Server First Responder Kit

See THIRD_PARTY_NOTICES.md for complete license texts.


License

Copyright (c) 2026 Darling Data, LLC. Licensed under the MIT License. See LICENSE for details.

Author

Erik Darling — erikdarling.comDarling Data, LLC

Reviews

No reviews yet

Sign in to write a review