背景
生产环境用户查询项目文件夹报错:
bash
org.springframework.dao.DataAccessResourceFailureException:
### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Read timed out
### The error may exist in com/ht/dp/doc/query/dao/DocQueryDao.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: EXEC Sp_GetCadFolderPriviAll ?, ?, ?, ?, ?, ?, ?
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Read timed out
; Read timed out; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Read timed out
数据库执行存储过程发生了超时,根据用户反馈非必现
分析步骤
将存储过程解析为sql语句,打开sqlsever的执行计划:
可以看到16行 扫描行数达到了298w行,拿到该行:
OBJECT:(.[dbo].[PrjFolder].[ix_PrjFolder_8] AS [a]), SEEK:([a].[PrjID]=[@c_PrjID]) ORDERED FORWARD
可以发现使用了项目id的关联:

这里添加了项目id,导致检索了全项目文件夹;通过分析业务,用户在查询父子级文件夹, JOIN Folder b ON a.ParentID = b.FolderID,已经满足了获取所有的父子级文件夹,无需增加项目id,按需关联条件。