安装SQL Server 2017后OpenDatasource/OpenRowSet运行极慢求助
解决SQL Server 2017中OPENROWSET/OPENDATASOURCE性能骤降的问题
这种升级后跨数据源查询性能滑坡的情况我碰到过好多次,大概率是SQL Server 2017的默认配置、优化器行为变化或者早期版本bug导致的,咱们一步步排查解决:
1. 先确认分布式查询的核心配置
SQL Server 2017对Ad Hoc Distributed Queries的默认设置可能和2016不同,先检查这个选项是否启用:
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries';
如果结果里的value是0,说明没启用,执行下面的命令开启后再测试性能:
sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
2. 优化连接字符串的驱动与参数
升级后系统默认的ODBC驱动可能更新了,旧的连接字符串可能存在兼容问题:
- 尝试指定明确的驱动版本,比如用
SQLNCLI11(对应SQL Server 2012+驱动)或者最新的MSOLEDBSQL驱动,避免自动选择的驱动适配不佳:SELECT * FROM OPENDATASOURCE('MSOLEDBSQL', 'Server=远程服务器地址;Database=目标库;Uid=账号;Pwd=密码').dbo.目标表 - 强制使用TCP/IP连接,避免命名管道的性能波动,在连接字符串里加
Network Library=DBMSSOCN参数。
3. 分析执行计划定位瓶颈
用SSMS的「包括实际执行计划」功能,或者执行SET SHOWPLAN_XML ON;后运行你的查询,重点看这两点:
- 是否远程数据源做了全表扫描:如果远程表没有合适的索引,2017的优化器可能会把所有数据拉到本地再过滤,这时候要给远程表加对应索引,或者在查询里明确写过滤条件让远程服务器先执行筛选。
- 是否存在隐式数据类型转换:本地列和远程列类型不匹配(比如varchar和nvarchar),会导致远程无法使用索引,升级后优化器对这类转换的性能惩罚更明显,要统一两边的数据类型。
4. 升级到最新的累积更新(CU)
SQL Server 2017早期版本(比如CU5之前)存在不少分布式查询的性能bug,比如OPENROWSET的内存泄漏、查询计划异常等问题,微软在后续的累积更新里都修复了。建议把你的SQL Server 2017升级到当前最新的CU版本,大概率能解决一些底层问题。
5. 重新生成执行计划与补充统计信息
虽然你已经跑了sp_updatestats,但跨数据源的统计信息可能没同步,试试这两个操作:
- 在查询末尾加
OPTION (RECOMPILE),强制生成适配2017的新执行计划,避免沿用2016的旧计划:SELECT * FROM OPENDATASOURCE(...)... WHERE ... OPTION (RECOMPILE); - 手动更新远程数据源的统计信息,确保远程服务器能返回准确的基数估计,帮助本地优化器生成更优的计划。
6. 尝试替代方案对比性能
如果以上方法都没明显改善,可以试试用更稳定的替代方式:
- 改用
OPENQUERY:它会把查询逻辑推送到远程服务器执行,减少数据传输量,性能往往更优:-- 先创建链接服务器(一次性操作) EXEC sp_addlinkedserver @server='远程服务器别名', @srvproduct='', @provider='MSOLEDBSQL', @datasrc='远程服务器地址'; EXEC sp_addlinkedsrvlogin @rmtsrvname='远程服务器别名', @useself='False', @rmtuser='账号', @rmtpassword='密码'; -- 用OPENQUERY查询 SELECT * FROM OPENQUERY(远程服务器别名, 'SELECT 列1,列2 FROM 远程表 WHERE 过滤条件'); - 正式配置链接服务器(Linked Server),而不是临时的OPENDATASOURCE,链接服务器可以配置RPC启用、安全上下文等参数,减少每次连接的开销。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

