SQL Server health review
Prepared by BPS
Use the right and left arrow keys to move between pages. Press G for a list of pages, N for presenter notes, F for full screen.
The review in one picture
Urgent means act soon. To plan means schedule it. Worth knowing is for awareness.
Server by server, area by area
Each box shows how many findings are in that area for that server. Red boxes show the number of urgent ones; amber boxes have nothing urgent and show how many to plan; grey boxes show items for awareness only; a green tick means nothing found. Most urgent items: sqlapp01.
Progress
| Server | Last run | Change | New | Fixed or gone |
| sqlapp01 | 2026-10-23 15:00 | 3→3 urgent 20→20 to plan | Nothing new | Nothing fixed |
| sqlprd01 | 2026-10-23 14:40 | 1→1 urgent 22→22 to plan | Nothing new | Nothing fixed |
Good news first
| Security | The sa login is disabled. (every server) xp_cmdshell is off. (every server) |
| Operations and monitoring | Backup compression is on by default. (every server) The scheduled-job service (SQL Server Agent) is running. (every server) |
At a glance
| sqlapp01 | SQL Server 2019: extended support until Jan 2030 | 4 urgent21 to plan |
| sqlprd01 | SQL Server 2019: extended support until Jan 2030 | 2 urgent22 to plan |
How the servers are connected
Each row is an availability group: one primary copy of the data (P) and secondary copies (S) kept in step on the other servers. This page shows how the servers are connected; the problems found are on the pages that follow.
The big three
Red = needs attention now, amber = watch, green = fine. Memory pressure is judged on page life expectancy as well as how full the memory is.
How the servers are set up
| sqlapp01 | Enterprise (core licensing) | 15.0.4500.2 | 8 processors | 47 GB set aside for SQL Server |
| sqlprd01 | Enterprise (core licensing) | 15.0.4500.2 | 16 processors | 109 GB set aside for SQL Server |
How the servers are set up
Based on the availability group design only. The feature check (compression, partitioning, encryption and more) was not part of this run.
How the servers are set up
6 copies of AppDb; primary: sqlprd01
| Server | Role | Updates | Failover | Readable | Network |
| sqlprd01 | Primary | – | Manual | Yes | 10.50.25.0/24 |
| sqlapp01 | Secondary | Does not wait (can lag) | Manual | Yes | 10.50.25.0/24 |
| sqlapp02 (not in this review) | Secondary | Does not wait (can lag) | Manual | Yes | 10.50.25.0/24 |
| sqlapp03 (not in this review) | Secondary | Does not wait (can lag) | Manual | Yes | 10.50.25.0/24 |
| sqldw01 (not in this review) | Secondary | Does not wait (can lag) | Manual | Yes | 10.50.18.0/24 |
| sqlrpt01 (not in this review) | Secondary | Does not wait (can lag) | Manual | Yes | 10.50.25.0/24 |
How the servers are set up
4 copies of FinanceDb; primary: sqlapp01
| Server | Role | Updates | Failover | Readable | Network |
| sqlapp01 | Secondary | Does not wait (can lag) | Manual | Yes | 10.50.25.0/24 |
| sqlapp03 (not in this review) | Secondary | Does not wait (can lag) | Manual | Yes | 10.50.25.0/24 |
| sqlfin01 (not in this review) | Secondary | Waits for the copy | Manual | Yes | |
| sqlrpt01 (not in this review) | Secondary | Does not wait (can lag) | Manual | Yes | 10.50.25.0/24 |
How the servers are set up
The whole high-availability picture on one page, before the detail. Each tile is judged on this audit’s data: green is fine, amber is worth planning, red needs action soon, grey was not reported. The next pages explain each tile.
How the servers are set up
Taken when the audit ran. Solid arrow = the primary waits for the copy; dashed = it does not, so the copy can fall behind. Queues are the data still waiting to be sent to, or applied on, the copy. Red = unhealthy, suspended or over a minute behind.
How the servers are set up
Every server in the cluster holds a vote and the cluster stays up only while more than half of all votes can talk to each other. A witness is an extra vote that avoids a tie.
Data protection
One bar per server; every database is a share of the bar. Red databases have no full backup in the last 7 days, no log backup where one is needed, or log backups thrown away.
Storage
One square per busy database file, worst first. Response time since the last restart; under 20 ms is good for data files.
Capacity
Each database is counted once, even where copies sit on several servers (availability groups). Disk used on each server, copies included: sqlapp01 1,561 GB, sqlprd01 1,453 GB.
Indexes
| Database | Table (columns) | Why |
| AppDb | [AppDb].[dbo].[Obj00527] | The optimizer asked for it 14,174 times; estimated 47% faster |
| AppDb | [AppDb].[dbo].[Obj00616_obj00507_usage] | The optimizer asked for it 242,802 times; estimated 100% faster |
| AppDb | [AppDb].[dbo].[Obj00793] | The optimizer asked for it 584,112 times; estimated 22% faster |
| AppDb | [AppDb].[dbo].[obj00794] | The optimizer asked for it 79,793 times; estimated 76% faster |
| AppDb | [AppDb].[dbo].[Obj00793] | The optimizer asked for it 457,541 times; estimated 19% faster |
| AppDb | [AppDb].[dbo].[Obj00793] | The optimizer asked for it 457,541 times; estimated 18% faster |
| AppDb | [AppDb].[dbo].[Obj00793] | The optimizer asked for it 457,541 times; estimated 18% faster |
| AppDb | [AppDb].[dbo].[Obj00793] | The optimizer asked for it 457,541 times; estimated 17% faster |
| AppDb | [AppDb].[dbo].[Obj00795] | The optimizer asked for it 547,145 times; estimated 14% faster |
| AppDb | [AppDb].[dbo].[obj00512] | The optimizer asked for it 32,058 times; estimated 48% faster |
10 suggested. The report holds each one with a script to copy.
Indexes
| Server | Job | State |
| sqlprd01 | IndexOptimize - USER_DATABASES | No schedule, not running |
Statistics age on the larger databases:
A job with no schedule may be started by something else; this check only sees Agent schedules and the last 7 days of runs.
UrgentCapacity and storage · 2 servers
UrgentData protection · 2 servers
| sqlapp01 | FinanceDb – SQL Server's own records show the transaction log of FinanceDb was “ba AppDb – SQL Server's own records show the transaction log of AppDb was “backed |
| sqlprd01 | AppDb: log backups were sent to NUL |
UrgentData protection · 1 server
| sqlprd01 | Backup job “Job00058.job00124_bk” fails often (60.1% success) Backup job “Job00058.AppDb_backup” fails often (90.0% success) |
UrgentCapacity and storage · 1 server
| sqlapp01 | 4 database file(s) have slow disk response |
PlanAvailability · 2 servers
| sqlapp01 | Cluster has 6 voting nodes and no witness |
| sqlprd01 | Cluster has 6 voting nodes and no witness |
PlanSecurity · 2 servers
| sqlapp01 | 14 database user(s) share a name with a different server login |
| sqlprd01 | 1 database user(s) share a name with a different server login |
PlanData protection · 2 servers
| sqlapp01 | 10 user database(s) have no successful consistency check (CHECKDB) in the last 14 days |
| sqlprd01 | 8 user database(s) have no successful consistency check (CHECKDB) in the last 14 days |
PlanSecurity · 2 servers
| sqlapp01 | 19 linked server mapping(s) need review |
| sqlprd01 | 12 linked server mapping(s) need review |
PlanData protection · 2 servers
| sqlapp01 | 2 database(s) have a worst-case data loss window of more than 24 hours |
| sqlprd01 | 3 database(s) have a worst-case data loss window of more than 24 hours |
PlanSecurity · 2 servers
| sqlapp01 | 14 enabled logins have full administrator (sysadmin) rights |
| sqlprd01 | 18 enabled logins have full administrator (sysadmin) rights |
PlanOperations and monitoring · 2 servers
| sqlapp01 | No SQL Agent alerts for corruption (errors 823, 824, 825) No SQL Agent alerts for severity 19-25 errors |
| sqlprd01 | No SQL Agent alerts for corruption (errors 823, 824, 825) No SQL Agent alerts for severity 19-25 errors |
PlanSecurity · 2 servers
| sqlapp01 | 2 server feature(s) widen the attack surface |
| sqlprd01 | 4 server feature(s) widen the attack surface |
PlanPerformance · 2 servers
| sqlapp01 | 10,055 (22%) statistics are older than 90 days; 100 have over 100,000 changes since the last update |
| sqlprd01 | 9,464 (43%) statistics are older than 90 days; 68 have over 100,000 changes since the last update |
PlanSecurity · 2 servers
| sqlapp01 | Permissions are granted to the public role in 15 database(s) |
| sqlprd01 | Permissions are granted to the public role in 3 database(s) |
PlanSecurity · 2 servers
| sqlapp01 | 31 SQL login(s) do not enforce the password policy |
| sqlprd01 | 25 SQL login(s) do not enforce the password policy |
PlanOperations and monitoring · 2 servers
| sqlapp01 | 9 (31%) enabled Agent jobs send no email at all |
| sqlprd01 | 22 (25%) enabled Agent jobs send no email at all |
PlanCapacity and storage · 2 servers
| sqlapp01 | FinanceDb – Log size 410 GB, 100% free, against 396 GB of data AppDb – Log size 231 GB, 100% free, against 306 GB of data |
| sqlprd01 | AppDb: the transaction log is 231 GB and almost empty |
PlanSecurity · 2 servers
| sqlapp01 | 2 encryption key or certificate problem(s) |
| sqlprd01 | 2 encryption key or certificate problem(s) |
PlanSecurity · 1 server
| sqlapp01 | 8 high-impact permission grant(s) to users or roles |
PlanOperations and monitoring · 1 server
| sqlprd01 | Database Mail reported 10 error(s) in the last 7 days |
PlanSecurity · 1 server
| sqlprd01 | Trustworthy is ON (only msdb should have it) in 1 database(s) |
PlanOperations and monitoring · 1 server
| sqlapp01 | Collation differs from the server and tempdb; string comparisons with temp tables can fail (3 database(s)) |
PlanPerformance · 1 server
| sqlapp01 | Query Store is read-only in 2 database(s) |
PlanAvailability · 1 server
| sqlprd01 | Connections to 3 secondary replica(s) time out repeatedly (15 times in the log) |
PlanOperations and monitoring · 1 server
| sqlprd01 | 4 Agent job(s) failed in the last 7 days |
PlanOperations and monitoring · 1 server
| sqlprd01 | 6 other Agent job(s) succeed less than 95% of the time |
PlanPerformance · 1 server
| sqlapp01 | tempdb configuration can be improved |
PlanCapacity and storage · 1 server
| sqlapp01 | 1 transaction log(s) have a very high virtual log file count |
The way forward
Hours per kind of problem, taken from the remediation estimate. Bars are laid end to end in the order the work would be done; the real plan can run items in parallel.
Results
Before: 2026-10-23_143259 (2026-10-23 14:40). After: the newest run (2026-10-23 15:00). A measure is improved only when the second run no longer shows the problem; it is not a prediction. Measures only one of the two runs could take are left out.
Results
Same measures, taken from the second run.
Results
| Action | Where | Status |
| Add | [AppDb].[dbo].[Obj00527] | Still requested |
| Add | [AppDb].[dbo].[Obj00616_obj00507_usage] | Still requested |
| Add | [AppDb].[dbo].[Obj00793] | Still requested |
| Add | [AppDb].[dbo].[obj00794] | Still requested |
| Add | [AppDb].[dbo].[Obj00793] | Still requested |
| Add | [AppDb].[dbo].[Obj00793] | Still requested |
| Add | [AppDb].[dbo].[Obj00793] | Still requested |
| Add | [AppDb].[dbo].[Obj00793] | Still requested |
| Add | [AppDb].[dbo].[Obj00795] | Still requested |
| Add | [AppDb].[dbo].[obj00512] | Still requested |
The plan
| Work | Items | BPS effort |
| Urgent items | 4 | 27 hours |
| Items to plan | 24 | 93 hours |
| Total | 28 | 120 hours |