问题描述
我发现我的sql Server作业偶尔会卡住,大约每两个月一次。由于我不是来自DBA的背景,因此我需要一些帮助来纠正此问题。
到目前为止,我已经尝试通过检查活动监视器来查明问题。我发现问题是由我的存储过程之一引起的,该存储过程将创建一个临时表来收集数据,然后将数据插入到我的一个事务表中。该表有4亿条记录。
每当出现此问题时,我就会停止工作,并且:
- 我重新运行作业,存储过程可以完成
- 我手动执行存储过程,存储过程完成
我实现了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 (将#修改为@)