Server Health Report – RockyPC – 2026-05-30
Tuning Goal: Server Health
Executive summary
- Establish integrity and recoverability immediately. Multiple user databases have effectively never recorded
DBCC CHECKDBexecution, and several databases inFULLrecovery have no full or log backups. This is the highest-risk finding because corruption or data loss could go undetected and unrecoverable. - Tune the handful of very expensive analytical queries in SQLStorm. The largest plans show extreme CPU time, millions of logical reads, and memory grants up to 762,088 KB. The most obvious offenders scan large tables, use window functions heavily, and include non-SARGable predicates such as
LIKE '%' + t.TagName + '%'. - Enable better plan-cache hygiene.
optimize for ad hoc workloadsis disabled while many high-cost plans appear to be single-use. Enabling it is a safe server-level improvement for this workload pattern. - Improve operational observability. There are no current deadlocks or memory-grant waits, but blocked-process reporting is disabled and backup/checkdb discipline is weak. Add baseline monitoring so concurrency and integrity issues are caught earlier.
- Security posture is currently good. All current user connections are encrypted, all are local shared-memory sessions, and there is only one sysadmin login. Continue least-privilege discipline and certificate-backed TLS for any future TCP remote access.
Top risk
CHECKDB and backup gaps
Primary performance issue
Expensive query patterns, not storage
I/O health
Excellent latency (mostly 0–3 ms)
Memory pressure now
No RESOURCE_SEMAPHORE waiters
Lock manager
1.65 MB, not elevated
Security
100% encrypted current connections
Health snapshot
| Area | Finding | Assessment |
|---|---|---|
| Wait statistics | PWAIT_DIRECTLOGCONSUMER_GETNEXT, QDS_PERSIST_TASK_MAIN_LOOP_SLEEP, and QDS_ASYNC_QUEUE dominate. |
Mostly benign/background or idle-type waits; not evidence of a current bottleneck. |
| I/O | All reported file latencies are excellent, generally 0–3 ms. | Healthy |
| CPU/query cost | Several plans consume 83–342 seconds CPU each with millions of logical reads. | High optimization opportunity |
| Memory grants | Large grants observed up to 762 MB-class range; no active waiters. | Needs query tuning, but not an acute server-wide emergency |
| Lock memory | Lock manager cache is 1.65 MB. | Far below critical threshold |
| Buffer pool | Buffer pool ~4.2 GB, tempdb dominates cached pages. | Consistent with light/moderate active working set; no red flag because lock memory is low. |
| Query Store | Enabled and writable on listed user databases. | Good foundation |
| Integrity | Most user DBs show no meaningful CHECKDB history; one is 48 days old. | Critical maintenance gap |
| Backups | Many databases have no full backups; several FULL recovery DBs have no log backups. | Critical recovery gap |
| Encryption | 10/10 current user sessions encrypted; all shared memory. | Secure current state |
| Sysadmin membership | Single sysadmin: RockyPC\k_a_f. |
Reasonable |
| Deadlocks | No deadlocks in last 7 days. | Healthy |
Server Health Overview
----------------------
Performance : Query-bound [########--]
I/O : Healthy [##--------]
Memory : Stable now [###-------]
Integrity : At risk [##########]
Recovery : At risk [##########]
Security : Good current [##--------]
Concurrency : Good current [##--------]
Detailed prioritized recommendations
-
Implement a formal CHECKDB schedule for every user database immediately.
Priority 1
- Critical databases with effectively missing CHECKDB history: WideWorldImporters, SQLStorm, tpcc, tpch, CRM, tpch10.
- DigitsSolver is also overdue at 48 days.
- Recommendation: run
DBCC CHECKDBnow during the next safe maintenance window, then schedule at least weekly for non-critical dev/test and daily-to-weekly depending on business value. For larger databases, offload to a restored backup copy if needed, but still ensure regular execution.
-
Fix backup and log-backup coverage before doing further tuning.
Priority 1
- No full backups recorded for master, model, msdb, DigitsSolver, tpcc, CRM, tpch10.
FULLrecovery without log backups for model, DigitsSolver, tpcc, tpch, CRM, tpch10.- If point-in-time recovery is not required for some dev databases, switch them to
SIMPLErecovery deliberately; otherwise start full + log backup chains immediately.
-
Tune the worst SQLStorm queries with emphasis on join patterns, search predicates, and pre-aggregation.
Priority 2
- The heaviest plans are dominated by large scans, complex CTE chains, repeated aggregation, and window functions across tables such as
Posts,Votes,Users,Badges, andComments. - The standout anti-pattern is
p.Tags LIKE '%' + t.TagName + '%', which is non-SARGable and prevents efficient indexing. - Several plans request very large memory grants but use only a fraction of them, indicating estimation or shape inefficiency.
- Refactor to normalize tags into a bridge table, pre-aggregate vote/comment counts once, avoid repeated correlated subqueries, and reduce wide intermediate rowsets before ranking.
- The heaviest plans are dominated by large scans, complex CTE chains, repeated aggregation, and window functions across tables such as
-
Enable
optimize for ad hoc workloads. Priority 2- This server shows many large, single-execution plans in cache.
- Enabling the setting reduces wasted plan cache memory from one-off ad hoc compilations and is low risk.
-
Keep current MAXDOP and cost threshold under review, but do not change urgently.
Priority 3
MAXDOP = 8on a 16-logical-CPU host is reasonable.cost threshold for parallelism = 30is also reasonable and better than default.- No evidence here suggests these are the primary cause of the current pain.
-
Retain Query Store everywhere and tighten settings for more actionable history in SQLStorm.
Priority 3
- Query Store is enabled and writable across the listed user databases, which is good.
- For SQLStorm, current usage is only 19 MB of 1000 MB. Consider switching capture mode from
AUTOtoCUSTOMor keepingAUTOwhile lowering noise through targeted thresholds, and reduce analysis intervals where you need finer trend visibility. - WideWorldImporters is at compatibility level 130. Because the instance is SQL Server 2022, evaluate raising compatibility to 160 after testing to unlock SQL Server 2022 optimizer features such as PSP optimization and DOP feedback.
-
No emergency lock-memory remediation is required now, but keep guardrails documented.
Priority 3
OBJECTSTORE_LOCK_MANAGERis not elevated; the lock manager cache is only 1.65 MB, far below the 20–25% critical threshold.- No
RESOURCE_SEMAPHOREwaiters are present. - Current lock counts are modest; only session 57 shows object/page locks and not in alarming volume.
- If this changes later and lock memory becomes excessive, emergency remediation can include
DBCC FREESYSTEMCACHE ('Lock Manager : Node 0'), but only as a temporary relief measure after identifying the offending workload.
-
Continue least-privilege and encryption practices.
Priority 3
- All current connections are encrypted and shared memory; no unencrypted TCP clients are present.
- Only one sysadmin exists, which is appropriate for a workstation/developer host.
- For any future remote access, deploy a trusted TLS certificate and force encryption at the server endpoint.
Performance improvements
- Target query rewrites before infrastructure changes.
- I/O latency is excellent; storage is not the bottleneck.
- Wait stats are not pointing to CPU scheduler pressure, latch storms, or memory-grant queueing.
- The evidence points to inefficient query patterns causing large scans and grants.
- Prioritize these plan-cache offenders for tuning in SQLStorm.
Query Hash Primary Symptom Why It Matters Recommendation 558D53CC7558B81F341s avg CPU, 4.1M logical reads, 458MB grant Large ranking and aggregate pipeline Pre-aggregate votes, index join/filter columns, trim columns before windowing 872C7773968C6AAF213s avg CPU, 866k reads, 577MB grant Non-SARGable tag search with LIKE '%tag%'Normalize tags to bridge table; avoid wildcard-leading predicate 87EB726133317ADD114s avg CPU, 6.6M reads Large multi-table aggregates Aggregate per table once, then join smaller result sets 57CAE2375FFE508583s avg CPU, 5.1M reads, 282MB grant Distinct count + wide joins + ranking Stage into temp tables with supporting indexes 83371E96D4DD244A762MB memory grant Largest grant on server sample Reduce row width/cardinality early; inspect estimates vs actuals in Query Store - Query-shape recommendations for this workload.
- Replace repeated scalar subqueries against
VotesandCommentswith grouped derived tables or temp-table staging. - Avoid joining
Usersto rawPosts,Votes,Comments, andBadgesall at once before aggregation; that can explode row counts and distort grants. - When ranking, compute the smallest necessary set first, then apply
ROW_NUMBER,RANK, orDENSE_RANK. - For reporting procedures, consider temporary result materialization with narrow indexes if the same intermediate sets are reused.
- Replace repeated scalar subqueries against
- Memory assessment.
- Committed memory is 5.3 GB against a target of 8.5 GB, well below
max server memory. SQL Server is not currently consuming its ceiling. - Buffer pool is 4.23 GB and
MEMORYCLERK_SQLQERESERVATIONSis 565 MB, consistent with query memory reservations but not an active server-wide crisis. - No red flag exists for lock-manager pressure because lock memory is tiny relative to total SQL memory.
- Committed memory is 5.3 GB against a target of 8.5 GB, well below
Configuration optimizations
- Enable
optimize for ad hoc workloads.- Recommended because many costly plans show execution count = 1.
- Expected benefit: reduced plan cache bloat from single-use statements.
- Consider enabling backup checksum default and backup compression default.
- Both are currently disabled.
- On modern hardware, compressed backups usually reduce elapsed time and storage while checksums improve backup validation confidence.
- Optionally enable remote admin connections for break-glass administration if remote TCP access is used.
- Current value is
0. On a local-only dev workstation this is acceptable, so this is optional rather than urgent.
- Current value is
- Consider tempdb metadata optimization only if tempdb contention emerges.
tempdb metadata memory-optimizedis off.- No contention symptoms are shown here, so do not change preemptively.
- Do not change max server memory urgently.
23,168 MBon a 32 GB host leaves room for OS and tools, which is sensible on a workstation.
Index optimization opportunities
- No high-value missing indexes were detected by the supplied workload sample.
- This does not prove indexing is optimal.
- In this case, missing-index DMVs likely under-report because the biggest problem is query shape and non-SARGable predicates, not just absent indexes.
- Likely candidate indexing areas in SQLStorm after query refactoring.
Posts(OwnerUserId, CreationDate)supporting per-user latest/ranked post logic.Posts(PostTypeId, CreationDate)for frequent question filtering.Votes(PostId, VoteTypeId)for upvote/downvote aggregation.Comments(PostId)andBadges(UserId)for count aggregation.
- Recommendation: run a comprehensive index analysis using the Index Tuning goal for SQLStorm first, because that is where the expensive plans are concentrated.
Query Store optimization
- Keep Query Store enabled on all listed user databases.
- Current state is healthy: all listed user databases are
READ_WRITE.
- Current state is healthy: all listed user databases are
- Optimize settings for SQLStorm.
- Current settings are acceptable, but this appears to be the active tuning target and can benefit from more focused capture.
- Recommended starting point: keep size at 1000 MB, retain auto cleanup, and consider shorter stats interval if you want more granular benchmarking during active tuning.
- Use Query Store to compare runtime stats before and after each rewrite and to force only if a known good plan is stable and reproducible.
- Review WideWorldImporters compatibility level.
- It is at level 130 while the engine is SQL Server 2022.
- After validation, raising compatibility to 160 would enable modern optimizer features and improve Query Store insight usefulness for current engine behavior.
Database integrity maintenance
- Databases overdue or effectively missing CHECKDB:
- Critical / effectively never recorded: WideWorldImporters, SQLStorm, tpcc, tpch, CRM, tpch10
- Critical / stale: DigitsSolver (48 days)
- Recommended schedule.
- System databases: weekly minimum.
- Important user databases: weekly minimum; daily for highly valuable or frequently changing databases.
- Large databases: consider offloading CHECKDB to a restored copy, but keep cadence documented and verified.
- Recovery recommendations.
- Take immediate full backups of databases with none recorded.
- For
FULLrecovery databases, start log backups or change recovery model toSIMPLEif point-in-time recovery is unnecessary. - Run restore tests regularly; backup existence alone is not sufficient.
Security enhancements
- Encryption status is good.
- All 10 current user connections are encrypted.
- All are shared-memory local sessions; these may be ignored from network-risk perspective as requested.
- No unencrypted telemetry concern is present in the supplied data.
- Least privilege is currently appropriate.
- Only one sysadmin account is present:
RockyPC\k_a_f. - Retain this minimal posture and avoid adding service, app, or personal accounts to sysadmin unless absolutely necessary.
- Only one sysadmin account is present:
- Forward-looking hardening.
- For remote TCP connections, configure a trusted server certificate and force encryption.
- Periodically audit login membership, disabled logins, and unused elevated permissions.
Concurrency issues
- No deadlocks detected in the last 7 days.
- No deadlock graph analysis is required from the supplied data.
- If deadlocks appear later, run a dedicated detailed analysis using the Fix Deadlocks goal.
- Current locking is not excessive.
- Session 57 has 45 object locks and 8 page locks, which is not alarming by itself.
- No evidence of runaway lock memory,
ROWLOCKmisuse, or page/row lock disabling was supplied.
- Improve visibility into blocking.
blocked process thresholdis 0, so blocked-process reports are disabled.- Enable a modest threshold such as 15 seconds if you want proactive blocking diagnostics.
Operational best practices
- Patch planning: the instance is SQL Server 2022 RTM-GDR. Stay current on supported CUs/GDRs after validating for your tooling and workload.
- Document intended recovery models per database so FULL recovery databases without log backups do not persist by accident.
- Baseline key DMVs daily or weekly: waits, file stats, memory grants, top Query Store regressions, backup age, CHECKDB age, and failed jobs.
- Use Query Store as the primary tuning ledger for SQLStorm and capture before/after runtime changes for each rewrite.
- Where analytical procedures are experimental, consider running them in isolated windows to reduce cache churn and memory-grant variability.
Confidence levels
- High confidence: integrity risk from missing/stale CHECKDB history; recovery risk from absent full/log backups; healthy current encryption posture; low lock-manager risk; healthy I/O subsystem.
- Medium-high confidence: primary performance bottleneck is query design rather than server configuration or storage.
- Medium confidence: recommended indexing areas in SQLStorm, because missing-index DMVs did not surface strong candidates and final design should follow query refactoring and execution-plan review.
- Medium confidence: Query Store setting refinements beyond current configuration, because current settings are already broadly healthy and further tuning depends on desired retention granularity.
Scripts
Enable optimize for ad hoc workloads and improve backup defaults (implements configuration recommendations)
USE [master];
GO
EXEC sys.sp_configure N'show advanced options', 1;
RECONFIGURE;
GO
EXEC sys.sp_configure N'optimize for ad hoc workloads', 1;
EXEC sys.sp_configure N'backup checksum default', 1;
EXEC sys.sp_configure N'backup compression default', 1;
RECONFIGURE;
GO
Enable blocked process reporting at 15 seconds (implements concurrency observability recommendation)
USE [master];
GO
EXEC sys.sp_configure N'show advanced options', 1;
RECONFIGURE;
GO
EXEC sys.sp_configure N'blocked process threshold (s)', 15;
RECONFIGURE;
GO
Run DBCC CHECKDB for overdue user databases now (implements integrity recommendation)
USE [master];
GO
DBCC CHECKDB (N'WideWorldImporters') WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
DBCC CHECKDB (N'SQLStorm') WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
DBCC CHECKDB (N'tpcc') WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
DBCC CHECKDB (N'tpch') WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
DBCC CHECKDB (N'CRM') WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
DBCC CHECKDB (N'tpch10') WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
DBCC CHECKDB (N'DigitsSolver') WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
Take immediate full backups for databases with no recorded full backup (implements recovery recommendation)
USE [master];
GO
BACKUP DATABASE [master] TO DISK = N'C:\SQLBackups\master_FULL.bak' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP DATABASE [model] TO DISK = N'C:\SQLBackups\model_FULL.bak' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP DATABASE [msdb] TO DISK = N'C:\SQLBackups\msdb_FULL.bak' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP DATABASE [DigitsSolver] TO DISK = N'C:\SQLBackups\DigitsSolver_FULL.bak' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP DATABASE [tpcc] TO DISK = N'C:\SQLBackups\tpcc_FULL.bak' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP DATABASE [CRM] TO DISK = N'C:\SQLBackups\CRM_FULL.bak' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP DATABASE [tpch10] TO DISK = N'C:\SQLBackups\tpch10_FULL.bak' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
Start log backup chain for FULL recovery databases that should remain in FULL (implements recovery recommendation)
USE [master];
GO
BACKUP LOG [model] TO DISK = N'C:\SQLBackups\model_LOG.trn' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP LOG [DigitsSolver] TO DISK = N'C:\SQLBackups\DigitsSolver_LOG.trn' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP LOG [tpcc] TO DISK = N'C:\SQLBackups\tpcc_LOG.trn' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP LOG [tpch] TO DISK = N'C:\SQLBackups\tpch_LOG.trn' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP LOG [CRM] TO DISK = N'C:\SQLBackups\CRM_LOG.trn' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
BACKUP LOG [tpch10] TO DISK = N'C:\SQLBackups\tpch10_LOG.trn' WITH INIT, CHECKSUM, COMPRESSION, STATS = 10;
GO
Switch selected non-production databases to SIMPLE recovery if point-in-time restore is not required (implements recovery model alignment recommendation)
USE [master];
GO
ALTER DATABASE [DigitsSolver] SET RECOVERY SIMPLE WITH NO_WAIT;
GO
ALTER DATABASE [tpcc] SET RECOVERY SIMPLE WITH NO_WAIT;
GO
ALTER DATABASE [tpch] SET RECOVERY SIMPLE WITH NO_WAIT;
GO
ALTER DATABASE [CRM] SET RECOVERY SIMPLE WITH NO_WAIT;
GO
ALTER DATABASE [tpch10] SET RECOVERY SIMPLE WITH NO_WAIT;
GO
Adjust Query Store settings for SQLStorm for active tuning work (implements Query Store recommendation)
USE [master];
GO
ALTER DATABASE [SQLStorm] SET QUERY_STORE = ON;
GO
ALTER DATABASE [SQLStorm] SET QUERY_STORE (
OPERATION_MODE = READ_WRITE,
CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),
DATA_FLUSH_INTERVAL_SECONDS = 900,
INTERVAL_LENGTH_MINUTES = 15,
MAX_STORAGE_SIZE_MB = 1000,
QUERY_CAPTURE_MODE = AUTO,
SIZE_BASED_CLEANUP_MODE = AUTO,
MAX_PLANS_PER_QUERY = 200
);
GO
Raise WideWorldImporters compatibility level to 160 after validation (implements version-capability recommendation)
USE [master];
GO
ALTER DATABASE [WideWorldImporters] SET COMPATIBILITY_LEVEL = 160;
GO
Emergency only: clear Lock Manager cache if lock memory becomes excessive (implements emergency remediation option)
USE [master];
GO
DBCC FREESYSTEMCACHE ('Lock Manager : Node 0');
GO