Additional SQL Server features and topics not covered by specific categories
Addition to @Erland Sommarskog solution, you may try following:
SELECT session_id, blocking_session_id, wait_type, wait_resource, status, command
FROM sys.dm_exec_requests WHERE session_id > 50
ORDER BY blocking_session_id DESC;
If blocking_session_id is populated, it's a blocking chain. If it's all zeros and everything is still slow, it's a resource problem, not a lock.
If blocking, find the head:
SELECT s.session_id, s.status, s.open_transaction_count, s.host_name, s.program_name, ib.event_info
FROM sys.dm_exec_sessions s
CROSS APPLY sys.dm_exec_input_buffer(s.session_id, NULL) ib
WHERE s.session_id IN (SELECT blocking_session_id FROM sys.dm_exec_requests WHERE blocking_session_id <> 0);
Sleeping with an open transaction means an app left a transaction uncommitted. KILL <spid> clears it.
To catch it next time:
EXEC sp_configure 'blocked process threshold', 15; RECONFIGURE;
Then an Extended Events session on blocked_process_report.