快下班了,客服的一个小朋友,跑来找我救命,说现在服务卡爆了,CPU一直100%
打开页面一个复杂查询的地方,一直loadding......等了27秒,正常一般1秒左右,看了下活动监视器,等待类型基本是Latch和Lock,以为是有死锁了,查看阻塞,一直在变化,没有固定的阻塞,那就不是死锁了.
想着之前遇到过的一个情况,有大量的sql在反复执行,也是这种症状,查看了下缓存计划,按照CPU和执行次数倒序查看。果然最前面几个一直在疯狂执行,F5一下,就多了10多次查询,当时已经2K多次,找到相关语句和表,然后问那小盆友,是什么程序在运行,他说是我另外一个同事写的,我也不清楚到底是什么,就让他先把进程杀了,然后我们前后上服务器找了一圈也没找到,反正一直还在执行
(@p__linq__0 nvarchar(4000),@p__linq__1 uniqueidentifier,@p__linq__2 datetime2(7))
SELECT CASE WHEN ( EXISTS (SELECT 1 AS [C1] FROM [dbo].[XXXXX]
AS [Extent1] WHERE ([Extent1].[call_id] = @p__linq__0) AND
([Extent1].[EmployeeID] = @p__linq__1) AND ([Extent1].[release_time] = @p__linq__2) ))
THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT 1 AS [C1] FROM [dbo].[XXXXX] AS
[Extent2] WHERE ([Extent2].[call_id] = @p__linq__0) AND ([Extent2].[EmployeeID] =
@p__linq__1) AND ([Extent2].[release_time] = @p__linq__2) )) THEN cast(0 as bit) END AS
[C1] FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
最后只有放大招,把表名字改了,让程序报错,刚改掉,看了下活动监视器,一切正常了。最后执行了6661次
好吧,明天再来研究问题。。。
今天一早找到问题的地方了。有一个添加方法前,加的一个判断:
尝试执行,查看下任务计划
Declare @p__linq__0 nvarchar(4000)='67679506247765248711575786300227',
@p__linq__1 uniqueidentifier='6E3D95A9-752F-4BE2-8506-928B8D3F63BD',
@p__linq__2 datetime2(7)='2019-12-08 14:25:24.000'
SELECT
CASE
WHEN ( EXISTS (
SELECT 1 AS [C1] FROM [dbo].[XXXX] AS [Extent1] WHERE ([Extent1].[call_id] = @p__linq__0) AND ([Extent1].[EmployeeID] = @p__linq__1) AND ([Extent1].[release_time] = @p__linq__2)
)) THEN cast(1 as bit)
WHEN ( NOT EXISTS (
SELECT 1 AS [C1] FROM [dbo].[XXXX] AS [Extent2] WHERE ([Extent2].[call_id] = @p__linq__0) AND ([Extent2].[EmployeeID] = @p__linq__1) AND ([Extent2].[release_time] = @p__linq__2)
)) THEN cast(0 as bit)
END AS [C1] FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
扫描计数 5,逻辑读取 20728 次,物理读取 0 次,预读 19387 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
并行,索引扫描,每次500多万,又连着在执行,尼玛不卡死有鬼了。
CREATE NONCLUSTERED INDEX [IX_callid_relesetime_empid] ON [dbo].[XXXX]
(
[call_id] ASC,
[release_time] ASC,
[EmployeeID] ASC
)
添加索引,小盆友立马就来消息了,大哥你干了什么?瞬间都不卡了。。。顺便给他讲解了下,以后别找我了。。。哥们也是小白