ODBC传递查询客户端显示完成但服务器仍运行问题求助
Access ODBC传递查询客户端显示完成但服务器仍长时间运行的问题排查
环境信息
- Microsoft® Access® for Microsoft 365 MSO(版本2202 内部版本16.0.14931.20888)64位
- Microsoft SQL Server 2019 - 15.0.4261.1 (X64) 标准版(64位),运行于Windows Server 2016 Datacenter 10.0
- 系统类型:64位操作系统,基于x64的处理器
问题描述
通过64位文件DSN建立Access到SQL Server的ODBC传递查询,某大型查询在客户端约5分钟就显示运行完成并返回正确记录(ODBC超时设置为540秒),但服务器端显示该查询持续运行45分钟以上,直到手动终止Access才断开连接。
可能原因
- 结果集异步处理:Access在获取第一批满足条件的记录后就标记查询完成,但服务器仍在后台继续处理剩余结果集,直到所有数据传输完毕或连接中断。
- ODBC驱动行为:64位ODBC驱动可能存在后台数据预取或连接保持机制,客户端显示完成后,驱动仍维持与服务器的连接并继续接收数据。
- SQL Server执行计划特性:查询执行计划包含并行执行、延迟物化等逻辑,客户端拿到部分结果后,服务器仍在完成后续计算或数据处理。
- Access连接管理缺陷:Access显示结果后未正确发送终止查询的指令,导致服务器端进程持续运行。
排查方法
- 监控SQL Server会话状态:使用动态管理视图查询会话的执行细节,确认是否在后台传输数据:
SELECT r.session_id, r.status, r.command, r.total_elapsed_time/1000 AS elapsed_sec, r.row_count, s.host_name FROM sys.dm_exec_requests r JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id WHERE s.host_name = '你的客户端主机名'; - 验证ODBC超时机制:将ODBC查询超时设置为更短时间(如60秒),观察服务器端进程是否会自动终止,排查超时设置是否未生效。
- 调整查询参数:在传递查询开头添加
SET NOCOUNT ON减少服务器消息量;或临时用TOP N限制返回行数,测试客户端显示完成后服务器进程是否立即结束。 - 更新ODBC驱动:确认使用最新版SQL Server ODBC驱动(如ODBC Driver 17 for SQL Server),旧版本可能存在连接管理bug。
- 跟踪ODBC通信日志:通过ODBC数据源管理器开启跟踪,记录客户端与服务器的交互,查看客户端是否发送了终止查询的指令。
- 分析查询执行计划:生成查询的实际执行计划,检查是否存在并行查询、排序、键查找等耗时操作,确认服务器端是否在后台处理剩余数据。
内容的提问来源于stack exchange,提问作者C.George
相关产品推荐
相关产品推荐

