Everything was fine yesterday—now it’s super slow!

SQL Server DBA Troubleshooting Guide: Why Are Queries Suddenly Crawling?

If you manage SQL Server databases, you’ve heard the panic:
“Everything was fine yesterday—now it’s super slow!”
Before you dive in, here’s a structured, stress-busting troubleshooting guide to help you identify and resolve the cause of poor performance.

Step 1: Scope the Impact

Is the issue affecting just one query, or the whole system?
Start by pinpointing high-impact queries:

SELECT TOP 10 
 total_elapsed_time / 1000 AS ElapsedMS,
 execution_count,
 total_logical_reads,
 (SELECT TEXT FROM sys.dm_exec_sql_text(sql_handle)) AS QueryText
FROM sys.dm_exec_query_stats
ORDER BY total_elapsed_time DESC;
SQL

Use this to quickly spot resource-hogging queries.

Step 2: What’s Running Right Now?

Check active sessions and ongoing requests.
Tools: Activity Monitor, sp_whoisactive, or:

SELECT * 
FROM sys.dm_exec_requests 
WHERE status = 'running';
SQL

Watch for:

  • Blocking sessions
  • Wait types (see sys.dm_os_waiting_tasks)
  • Heavy TempDB usage
  • CPU spikes

Step 3: Analyze Wait Stats

Find out where SQL Server is “waiting.”

SELECT wait_type, wait_time_ms
FROM sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC;
SQL
  • PAGEIOLATCH_*: Disk bottlenecks
  • CXPACKET: Parallelism issues
  • LCK_*: Locks causing waits
  • SOS_SCHEDULER_YIELD: CPU pressure

Step 4: Investigate Execution Plans

Execution plans reveal query inefficiencies.
Use Query Store or run:

SELECT qp.query_plan, qt.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt;
SQL

Look for:

  • Parameter sniffing (wrong plan reused)
  • Outdated statistics
  • Full scans (missing indexes?)
  • Bad row/IO estimates

Step 5: Index & Statistics Health Check

Fragmented or missing indexes and stale stats slow queries down.

SELECT * 
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED');
SQL

Fixes:

  • Rebuild/reorganize indexes
  • Refresh statistics
EXEC sp_updatestats;
SQL

Step 6: Blocking & Deadlock Investigation

Blocking and deadlocks can kill performance.

  • Use EXEC sp_who2;
  • Inspect locking with:
SELECT * FROM sys.dm_tran_locks;
SQL
  • Capture deadlocks using Extended Events.
  • Only kill blocking sessions as a last resort.

Step 7: TempDB & Disk I/O

TempDB bottlenecks and disk slowness are common culprits.

  • Monitor TempDB
    • SELECT * FROM sys.dm_db_file_space_usage;
  • Check disk IO health:
    • sys.dm_io_virtual_file_stats
  • Ensure TempDB has multiple data files for parallelization.

Step 8: Ask “What Changed?”

This is often the hidden culprit:

  • Recent deployments or code changes?
  • Indexes dropped or altered?
  • Statistics updated?
  • Server configuration tweaked?

Always check change history!

Step 9: Quick Fix Options

  • Use OPTION (RECOMPILE) to handle parameter sniffing
  • Add helpful indexes (after confirming necessity)
  • Pause or throttle heavy background jobs
  • Address and resolve blocking sessions

Step 10: Plan for the Future

Prevent recurring slowdowns by strengthening monitoring and maintenance:

  • Enable and use Query Store
  • Set up Extended Events for deep monitoring
  • Build custom alerts for spikes and outages
  • Schedule regular index maintenance and statistics updates

Final Step

  • Be diagnostic, not reactive.
  • Measure before acting: Always establish your environment’s baseline performance so you can quickly spot deviations.
  • Have scripts, checklists, and logs ready before trouble hits.

By following this checklist, you’ll turn “Why is it so slow?” into a springboard for smarter, faster resolutions — and plenty of DBA hero moments!

Happy troubleshooting! 🚀

Leave a Reply

Your email address will not be published. Required fields are marked *