Automated health checks - from MaxMemory to orphaned files
# Single instance
Get-sqmDatabaseHealth -ComputerName "SRV-SQL01"
# Entire fleet via AD OU
Get-sqmDatabaseHealth -Remote \`
-SearchOU "OU=DB,DC=corp,DC=de"
# Open the HTML report
Get-sqmDatabaseHealth -ComputerName "SRV-SQL01" \`
-OutputFormat HTML
Test-sqmMaxMemory -ComputerName "SRV-SQL01"
RecommendedMB : 12288
CurrentMB : 2147483647
Status : WARN
Message : No limit set
Recommendation: total RAM minus 2 GB for the OS, calculated per NUMA node
Test-sqmMaxDop -ComputerName "SRV-SQL01"
RecommendedDop : 4
CurrentDop : 0
NUMANodes : 2
LogicalCores : 16
Status : WARN
Calculated per Microsoft best practice (cores / NUMA, max. 8)
# Check file count vs. CPU cores
Test-sqmTempDbFileCount -ComputerName "SRV-SQL01"
# Generate a recommendation + script
Get-sqmTempDbRecommendation -ComputerName "SRV-SQL01"
Test-sqmCostThreshold -ComputerName "SRV-SQL01"
CurrentValue : 5
RecommendedValue : 50
Status : WARN
Message : Value too low
Cost Threshold controls the estimated plan cost above which SQL Server switches to parallel execution.
Value 5: almost every non-trivial query goes parallel → high CPU load
Value 50: only genuinely expensive queries use parallelism
# All databases on an instance
Invoke-sqmUpdateStatistics -ComputerName "SRV-SQL01"
# Specific databases only
Invoke-sqmUpdateStatistics -ComputerName "SRV-SQL01" \`
-DatabaseList "AdventureWorks","Sales"
UPDATE STATISTICS WITH FULLSCAN - logs the duration per database
# WhatIf - shows what would be shrunk
Invoke-sqmLogShrink -ComputerName "SRV-SQL01" -WhatIf
# With a minimum size
Invoke-sqmLogShrink -ComputerName "SRV-SQL01" \`
-MinShrinkMB 500
Only shrinks in Full recovery model, and only free log space
Get-sqmOrphanedFiles -ComputerName "SRV-SQL01"
FilePath : D:\MSSQL\DATA\OldDB.mdf
SizeGB : 24.5
LastWrite : 2025-03-15
Status : Orphaned
Find-sqmDatabaseObject -ComputerName "SRV-SQL01" \`
-ObjectName "sp_GetCustomer"
# With a type filter
Find-sqmDatabaseObject -ComputerName "SRV-SQL01" \`
-ObjectName "tbl_Orders%" \`
-ObjectType "TABLE"
# Entire fleet via AD OU
Get-sqmDatabaseHealth -Remote \`
-SearchOU "OU=SQLServer,DC=corp,DC=de" -OutputFormat HTML
# CSV export for every server
Get-Content "server-list.txt" | ForEach-Object {
Get-sqmDatabaseHealth -ComputerName $_ -OutputFormat CSV
} | Export-Csv "health-report.csv"
Parallel CIM sessions - 50 servers in under 2 minutes
Every check as a flat table for Excel or a SIEM
Color-coded report, opens straight in the browser
| Function | Category | Description | Remote |
|---|---|---|---|
| Get-sqmDatabaseHealth | Report | Overall report of all health checks | Yes |
| Test-sqmMaxMemory | Config | MaxMemory recommendation vs. current | Yes |
| Test-sqmMaxDop | Config | MaxDop recommendation per best practice | Yes |
| Test-sqmCostThreshold | Config | Check Cost Threshold for Parallelism | Yes |
| Test-sqmTempDbFileCount | TempDB | File count vs. CPU cores | Yes |
| Get-sqmTempDbRecommendation | TempDB | Generate a recommendation + script | Yes |
| Invoke-sqmUpdateStatistics | Maintenance | Update statistics (FULLSCAN) | Yes |
| Invoke-sqmLogShrink | Maintenance | Safely shrink transaction logs | Yes |
| Get-sqmOrphanedFiles | Files | Track down orphaned DB files | Yes |
| Find-sqmDatabaseObject | Search | Find objects across every database | Yes |