One‑liner na MSSQL: Vyplivni TOP 10 nejpomalejších dotazů bez SSMS webseidon lukáš Adámek webdesigner webdeveloper moravskoslezsky kraj weby

One‑liner na MSSQL: Vyplivni TOP 10 nejpomalejších dotazů bez SSMS

One‑liner na MSSQL: Vyplivni TOP 10 nejpomalejších dotazů bez SSMS

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 SqlServer je 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:

Plan

5 · 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 STATE na 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

KrokAvg_msZlepšení
Před (bez indexu)12 000 ms
Update statistiky4 800 ms‑60 %
Přidán covering index300 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

↥ Zpět nahoru

Sdílejte na sítích

Webseidon
Webseidon
Articles: 32