Dotnet
现象
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,有两个关键点:
- 会扫描整张表
- 分页前必须要ORDER BY
直觉认为ORDER BY的字段会影响查询速度
遂将ORDER BY的字段单独创建了索引,问题解决
未解决的疑点
- 为什么增加查询条件,能够不卡顿
- 为什么本地调试不卡
- 为什么分页大小10以下会卡,10以上不卡