Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

Массовые блокировки на базе

$
0
0
У меня временами в базе появляются блокировки. Появляются приступами в это время вылезают почти на каждом запросе. Запрос тормозит и часто вылетает с ошибкой "Превышено время ожидания блокировки". Причем все остальное время такой же запрос выполняется нормально. Скажите пожалуйста что тут можно предпринять. Как можно собрать статистику? И вообще где про это копать?
Я ловлю блокирующие запросы хранимой процедурой
+
CREATE procedure aip_Blocks 
@inTable int = null
as
    --kill @SPID
	/*
	в ALADA_TEST
begin tran
update schN_ set From_ = 11 where D_Reg='20161114 15:54:35.690'



select top 11 *from schn_ order by 1 desc
*/    
    DECLARE @Table TABLE( SPID INT, Status VARCHAR(MAX), LOGIN VARCHAR(MAX), HostName VARCHAR(MAX), BlkBy VARCHAR(MAX), DBName VARCHAR(MAX), Command VARCHAR(MAX), CPUTime INT, DiskIO INT, LastBatch VARCHAR(MAX), ProgramName VARCHAR(MAX), SPID_1 INT, REQUESTID INT)

    INSERT INTO @Table EXEC sp_who2

    --SELECT DISTINCT BlkBy FROM @Table

	--where BlkBy>0


	DECLARE @Res TABLE (SPID int, T varchar(4000))
    DECLARE @SPID int 

	DECLARE curs cursor for
	select
	  BlkBy
	from
	(
	SELECT DISTINCT 
    case 
	  when ltrim(rtrim(p.BlkBy))<>'.' --and  p.BlkBy not like '%[^0-9]%'
	  then cast(ltrim(rtrim(p.BlkBy)) as int)
	  else
	 0	
    end BlkBy
    FROM @Table p
	where DBName = DB_NAME()
	) p
	where BlkBy>0

	open curs
	while 0=0
	begin
	  fetch from curs into @SPID
	  if @@Fetch_Status<>0 break

		DECLARE @sql_handle binary(20), @stmt_start int, @stmt_end int

		SELECT @sql_handle = sql_handle, @stmt_start = stmt_start/2, @stmt_end = CASE WHEN stmt_end = -1 THEN -1 ELSE stmt_end/2 END
		FROM master.dbo.sysprocesses
		WHERE spid = @SPID AND ecid = 0

		DECLARE @line nvarchar(4000)

		SET @line = (SELECT SUBSTRING([text], COALESCE(NULLIF(@stmt_start, 0), 1),
		  CASE @stmt_end WHEN -1 THEN DATALENGTH([text]) ELSE (@stmt_end - @stmt_start) END) FROM ::fn_get_sql(@sql_handle))
        
		if @inTable = 1
		insert tblBlocks(SPID,T,DT) values(@SPID,@line,GetDate())
		else
		insert @Res(SPID,T) values(@SPID,@line)

    end
	close curs
	deallocate curs
    
   if isnull(@inTable,0)<>1
   Select * from @Res


    --SELECT * FROM @Table


но она временами дает странные результаты, например запросы с with (nolock), которые вообще не должны блокировать

Viewing all articles
Browse latest Browse all 7251

Trending Articles