SQL Server作业偶尔会卡住

问题描述

我发现我的sql Server作业偶尔会卡住,大约每两个月一次。由于我不是来自DBA的背景,因此我需要一些帮助来纠正此问题。

到目前为止,我已经尝试通过检查活动监视器来查明问题。我发现问题是由我的存储过程之一引起的,该存储过程将创建一个临时表来收集数据,然后将数据插入到我的一个事务表中。该表有4亿条记录。

每当出现此问题时,我就会停止工作,并且:

  1. 我重新运行作业,存储过程可以完成
  2. 我手动执行存储过程,存储过程完成

我实现了SP_BlitzCache,并执行了它。我可以看到它在存储过程中建议DBCC FREEPROCCACHE (0x0...)

CREATE TABLE #dtResult  
( 
    RunningNumber INTEGER,AlphaID BIGINT,BetaID BIGINT,Content varchar(100),X varchar(10),Y varchar(10)
) 
 
INSERT INTO #dtResult ( RunningNumber,...) 
    SELECT RowId AS RunningNumber,...
    FROM 
    ...


/*** Based on activity monitor,the highest cpu caused by this statement ***/
INSERT INTO tblTransaction ( ... ) 
    SELECT disTINCT  
        RES.AlphaID,b.UnitId,RES.BetaID,CASE WHEN RES.BinData IS NULL THEN [dbo].[fnGetCode](B.Data,RES.X,RES.Y) ELSE RES.Content END,CONVERT(DATETIME,SUBSTRING(RES.Timestamp,1,4) + '-' + SUBSTRING(RES.Timestamp,5,2) + '-' + SUBSTRING(RES.Timestamp,7,2)  + ' ' + SUBSTRING(RES.Timestamp,9,2)  + ':' + SUBSTRING(RES.Timestamp,11,13,2)  + '.' + SUBSTRING(RES.Timestamp,15,3),121) 
    FROM 
        #dtResult RES  
    INNER JOIN 
        tblA a with(nolock) ON RES.AlphaID = a.AlphaID  
    INNER JOIN 
        tblB b with(nolock) ON a.UnitId = b.UnitId AND CAST(RES.X AS INTEGER) = b.X AND CAST(RES.Y AS INTEGER) = b.Y 
    INNER JOIN 
        tblC c with(nolock) ON RES.BetaID = c.BetaID 
    LEFT OUTER JOIN 
        tblTransaction t with(nolock) ON RES.AlphaID = t.AlphaID AND RES.BetaID = t.BetaID AND t.UnitId = b.UnitId
    WHERE 
        t.BetaID IS NULL


/* FUNCTION */
CREATE FUNCTION [dbo].[fnGetCode]
(
    @Data   VARCHAR(MAX),@SearchX    INT,@SearchY    INT
)
RETURNS CHAR(4) 
WITH ENCRYPTION 
AS
BEGIN
    DECLARE @SearchResult CHAR(4)
    DECLARE @Pos INT
    SET @Pos = (@SearchY * @SearchX) + 1
    SET @SearchResult = CONVERT(char(1),SUBSTRING(@Data,@Pos,1),1) 
    RETURN @SearchResult
END

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)