One‑liner na MSSQL: Vyplivni TOP 10 nejpomalejších dotazů bez SSMS
„DB je pomalá“ – klasická hláška, co přijde v 5:00 pm. Otevřít SSMS, klikat v Activity Monitoru a scrollovat DMV? Ne, díky. Stačí PowerShell s modul SqlServer a jediný příkaz: dostaneš TOP 10 dotazů podle CPU, čtení nebo průměrného času, rovnou v HTML reportu s hyperlinkem na sys.dm_exec_query_plan. Celé hotové dřív, než se QA stihne zeptat, co se děje.
1 · Proč PowerShell místo SSMS
- No‑install. Modul
SqlServerje menší než SSMS (30 MB vs 1,2 GB). - Skriptovatelné. Lze spouštět na Linux agentu (pwsh + sqlcmd).
- Automatizace. Scheduler → trend grafy v Grafaně.
- Read‑only přístup. Stačí role VIEW SERVER STATE.
2 · Instalace modulu SqlServer
Install-Module -Name SqlServer -Scope AllUsers -Force
Na serveru bez internetového přístupu: Save‑Module → kopíruj.
3 · DMV dotaz na TOP 10
sql SELECT TOP 10 qs.total_worker_time/1000 AS CPU_ms, qs.total_logical_reads AS LReads, qs.execution_count AS Execs, qs.total_elapsed_time/qs.execution_count/1000 AS Avg_ms, SUBSTRING(qt.text, 1, 120) AS QueryText, qs.plan_handle FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt WHERE qs.last_execution_time > DATEADD(hour,-1,GETDATE()) ORDER BY Avg_ms DESC;
4 · One‑liner (HTML + CSV)
Invoke-Sqlcmd -Server "SQL01" -Database master `
-Query (Get-Content .\top10.sql -Raw) |
Tee-Object -File "C:\Reports\slow_top10.csv" |
ConvertTo-Html -Title "TOP10 Slow Queries" |
Out-File "C:\Reports\slow_top10.html"
Hotovo. Otevři HTML, máš tabulku i linky na execution plan:
Plan5 · Skript Invoke‑SqlTopSlow.ps1
param(
[string]$Sql = "SQL01",
[int] $Top = 10,
[int] $Hours = 1,
[string]$Out = "C:\Reports",
[switch]$Teams
)
Import-Module SqlServer
$ts = Get-Date -F yyyyMMdd_HHmm
$query = @"
SELECT TOP $Top
qs.total_worker_time/1000 AS CPU_ms,
qs.total_logical_reads AS LReads,
qs.execution_count AS Execs,
qs.total_elapsed_time/qs.execution_count/1000 AS Avg_ms,
SUBSTRING(qt.text,1,4000) AS QueryText,
'sqlserver://$Sql/?plan_handle='+sys.fn_varbintohexstr(qs.plan_handle) AS PlanLink
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
WHERE qs.last_execution_time > DATEADD(hour,-$Hours,GETDATE())
ORDER BY Avg_ms DESC;
"@
$data = Invoke-Sqlcmd -ServerInstance $Sql -Database master -Query $query
$csv = "$Out\slow_$ts.csv"
$htm = "$Out\slow_$ts.html"
$data | Export-Csv $csv -NoTypeInformation -Encoding UTF8
$data | ConvertTo-Html -Title "Slow $Sql" -PreContent "$Sql TOP $Top slow queries
" |
Out-File $htm
if ($Teams) {
$hook = Get-Content "$Out\teamsHook.txt"
Invoke-RestMethod -Uri $hook -Method Post -Body (@{text="Slow query report [$Sql] $ts. CSV: $csv"}|ConvertTo-Json) -ContentType 'application/json'
}
Write-Host "Report: $htm" -F Green
6 · Jak interpretovat sloupce
- CPU_ms: Celkový CPU čas (vyšší = dražší).
- LReads: Logické čtení stránek (I/O).
- Execs: Počet spuštění (možná optimalizovat caching).
- Avg_ms: Průměrná doba jedné exekuce.
- PlanLink: Klikni, otevře Plan v SSMS (bez extra query).
7 · Rychlá náprava: index & statistiky
UPDATE STATISTICS dbo.Orders WITH FULLSCAN;
CREATE INDEX IX_Orders_Customer ON dbo.Orders(CustomerId) INCLUDE (Status,Total);
Poté spusť skript znovu – latence by měla klesnout.
8 · Automatizace: denní snapshot trendů
$act = New-ScheduledTaskAction -Execute 'pwsh' `
-Argument '-File C:\Scripts\Invoke-SqlTopSlow.ps1 -Sql SQL01 -Teams'
$trg = New-ScheduledTaskTrigger -Daily -At 06:00
Register-ScheduledTask -TaskName 'SqlSlowDaily' -Action $act -Trigger $trg -RunLevel Highest
CSV můžeš ingestovat do Grafana/Loki → heatmapa latence.
9 · Permise & bezpečnost
- Potřebuješ minimálně právo
VIEW SERVER STATEna SQL. - Teams webhook – drž v souboru s ACL Admins.
- CSV může obsahovat citlivé query texty – šifruj disk nebo maskuj.
10 · Case study: 12 s → 300 ms za 15 minut
| Krok | Avg_ms | Zlepšení |
|---|---|---|
| Před (bez indexu) | 12 000 ms | — |
| Update statistiky | 4 800 ms | ‑60 % |
| Přidán covering index | 300 ms | ‑97,5 % |
Celkový čas: 15 minut včetně skriptu a deploy indexu.
11 · FAQ
- Musím povolit xp_cmdshell?
- Ne, dotaz čte jen DMVs.
- Funguje na Azure SQL?
- Ano, DMVs jsou stejné; použij
-Server tcp:server.database.windows.net,1433. - Proč ne Query Store?
- Query Store je super, ale někdy není zapnutý nebo chceš rychlou jednorázovou kontrolu.
12 · Závěr
Pár řádků PowerShellu, žádný SSMS, a přesto kompletní přehled, co ti žere SQL Server. Skript přidáš do CI/CD, DevOps i cron, a máš performance radar 24×7. Příště, když někdo řekne „DB je pomalá“, pošleš mu report a zeptáš se: „Ten index tam mám nahodit hned, nebo až po kávičce?“
Klíčová slova
mssql slow query, powershell sql, top slowest queries, dm_exec_query_stats, performance tuning, sql dmv report, invoke‑sqlcmd, automate sql audit




