首页 > 解决方案 > 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, 2)  + ':' + SUBSTRING(RES.Timestamp, 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

标签: sql-serversql-job

解决方案


推荐阅读