现象

1、本地运行不卡,docker中运行卡

2、生成的语句不卡

3、如果是增加查询条件,如isStar=true,就会不卡


生成的语句如下:

SELECT z0.*
FROM [ZJX_WorkTaskEmployee] AS [z]
INNER JOIN [ZJX_WorkTask] AS [z0] ON [z].[WorkTaskId] = [z0].[Id]
WHERE [z].[JobNumber] = @__jobNumber_0
ORDER BY [z].[WorkTaskId] DESC
OFFSET @__p_1 ROWS FETCH NEXT @__p_2 ROWS ONLY

在测试时,分页的offset 取值为0,fetch next 取值为15,并未有卡的情况。


排查1

因为是在docker中卡,初次判定为docker环境的问题,那么区别在于windows和linux的差异,有可能是ef core组件不兼容linux。

将ef core 组件更新为小版本最新版,结果是仍然卡

未解决。


排查2

考虑是网络的问题,将最新版的镜像文件部署到本机,仍然卡顿。

未解决。


排查3

接口中有记录阿里云日志的特性,考虑是不是因为连接阿里云导致的卡顿,

将特性注释后测试,问题依旧。

未解决。


排查4

考虑是不是语句问题,但是本机测试语句还是可以的,怪异的是当增加查询条件的时候,问题就会解决,

经过跟同事讨论,同事直觉认为是分页的问题

SELECT z0.*
FROM [ZJX_WorkTaskEmployee] AS [z]
INNER JOIN [ZJX_WorkTask] AS [z0] ON [z].[WorkTaskId] = [z0].[Id]
WHERE [z].[JobNumber] = @__jobNumber_0
ORDER BY [z].[WorkTaskId] DESC
OFFSET 0 ROWS FETCH NEXT 15 ROWS ONLY

无意中将分页的大小调整为10,发现语句卡了(当是15的时候不卡,如上所示)

SELECT z0.*
FROM [ZJX_WorkTaskEmployee] AS [z]
INNER JOIN [ZJX_WorkTask] AS [z0] ON [z].[WorkTaskId] = [z0].[Id]
WHERE [z].[JobNumber] = @__jobNumber_0
ORDER BY [z].[WorkTaskId] DESC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

刚开始以为是网络的原因,但是经过两台电脑的测试,发现当分页的大小<=10的时候,就会卡顿。

很诡异的一种现象


解决

经过百度,关于分页,使用OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY,有两个关键点:

  1. 会扫描整张表
  2. 分页前必须要ORDER BY

直觉认为ORDER BY的字段会影响查询速度

遂将ORDER BY的字段单独创建了索引,问题解决


未解决的疑点

  1. 为什么增加查询条件,能够不卡顿
  2. 为什么本地调试不卡
  3. 为什么分页大小10以下会卡,10以上不卡