On the topic of blocking processes, below is a quick and dirty way ofrecording blocking -
--CREATE A TABLE TO HOLD PROCESSES WHICH BLOCKED
CREATE TABLE [monitor].[log_blocking] (
[database_name] [varchar] (30) COLLATE Latin1_General_CI_AS NULL,
[waittype] [binary] (2) NULL,
[waitresource] [nchar] (256) COLLATE Latin1_General_CI_AS NULL,
[date_captured] [datetime] NULL,
[lastwaittype] [nchar] (32) COLLATE Latin1_General_CI_AS NULL,
[program_name] [nchar] (128) COLLATE Latin1_General_CI_AS NULL,
[cmd] [nchar] (16) COLLATE Latin1_General_CI_AS NULL,
[loginame] [nchar] (128) COLLATE Latin1_General_CI_AS NULL,
[text] [nvarchar] (max) COLLATE Latin1_General_CI_AS NULL )
--CREATE STORED PROCEDURE TO INSERT A NEW ROW WHEN BLOCKING HAPPENS
CREATE PROCEDURE [dbo].[mon_sp_record_blocking]
WITH EXECUTE AS CALLER AS set nocount on
insert into monitor.log_blocking
select db_name(dbid),
waittype, waitresource,
GETDATE(),
lastwaittype,
program_name,
cmd,
loginame,
(select text from sys.dm_exec_sql_text(sp.sql_handle))
from sys.sysprocesses as sp
where dbid = DB_ID('database_name') and blocked <> 0
Add the stored procedure to a job, run every 5 minutes or however long you want t check. Not perfect gives you a quick overview.