MS SQL 2019迁移后OLEDB链接服务器查询DB2延迟问题
问题根因
这是SQL Server 2019默认新增的查询处理逻辑与IBM DB2 OLEDB驱动适配缺陷共同导致的问题,观察到的20秒固定延迟有明确触发逻辑:
- 当数据库兼容级别为150(SQL Server 2019默认级别)时,引擎会对第三方OLEDB链接服务器在查询执行的收尾阶段额外发起全量元数据校验调用,IBM DB2旧版OLEDB驱动对该调用的响应存在阻塞,直到20秒内置超时触发才会返回结果、释放会话。
- SQL Server 2019调整了链接服务器的默认预取阈值:当查询预估返回行数<100行时,采用逐行拉取模式,拉取过程同步被元数据校验阻塞,表现为查10行要等20秒才出结果;当预估返回行数≥100行时自动触发批量预取,数据可以先返回到客户端,但收尾阶段的元数据校验依然会阻塞会话,表现为结果已经显示,但查询状态持续20秒显示“执行中”。
解决方案
按以下顺序逐一验证,绝大多数同类场景调整前两项即可恢复到SQL Server 2012下的查询性能:
- 启用链接服务器的延迟架构校验
执行以下系统存储过程,关闭2019版本新增的强制元数据即时校验逻辑,调整后无需重启实例,立即生效:EXEC master.dbo.sp_serveroption @server = N'[你的DB2链接服务器名称]', @optname = N'lazy schema validation', @optvalue = N'true' - 屏蔽兼容级别150下影响远程查询的新特性
如果第一项调整后仍有延迟,可选择两种方式处理:- 直接将业务数据库的兼容级别降级到110(与SQL Server 2012行为完全一致)
ALTER DATABASE [你的业务数据库名] SET COMPATIBILITY_LEVEL = 110; - 保留150兼容级别,单独关闭两个影响链接服务器查询的特性:
ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ON_ROWSTORE = OFF; ALTER DATABASE SCOPED CONFIGURATION SET DEFERRED_COMPILATION_TV = OFF;
- 直接将业务数据库的兼容级别降级到110(与SQL Server 2012行为完全一致)
- 调整DB2链接服务器的提供程序配置
打开SSMS中对应链接服务器的属性面板,进入「提供程序选项」页做以下修改:- 勾选
Dynamic parameters - 勾选
Allow inprocess(IBM DB2 OLEDB驱动必须开启进程内运行,否则跨进程接口调用会产生固定阻塞) - 取消勾选
Collation compatible(该选项仅在对接同源SQL Server链接服务器时生效,对DB2开启会额外触发无意义的排序规则校验请求)
- 勾选
- 升级DB2 OLEDB驱动
如果你当前使用的IBM DB2 OLEDB Driver版本低于11.5.4,替换为最新的正式修复版驱动即可,旧版本驱动未适配SQL Server 2019的OLEDB接口规范,本身存在接口响应延迟bug。
验证方法:调整配置后优先用
OPENQUERY写法做测试,排除本地查询解析的干扰,示例语句:SELECT TOP 10 * FROM OPENQUERY([你的DB2链接服务器名], 'SELECT 目标字段 FROM 远端DB2业务表')如果该语句执行耗时回到1秒以内,说明配置调整生效。
内容的提问来源于stack exchange,提问作者Guenter
相关产品推荐
相关产品推荐

