从SQL Server 2008快速查询Global Shop Solutions(GSS)的最优方案
优化SQL Server查询GSS链接服务器的速度
我需要从SQL Server查询存储在GSS中的数据,目前使用OPENQUERY方式查询速度极慢(仅检索约4000行数据就耗时50秒)。是否存在更快的查询方式?
当前使用的OPENQUERY查询示例
SELECT ORDER_NO FROM OPENQUERY( GSS, 'SELECT Order_No FROM ORDER_HEADER WHERE RECORD_TYPE = ''A''' )
尝试过的另一种慢查询
select * from [GSS].[DBName]..[TableName]
链接服务器配置脚本
USE [master] GO /****** Object: LinkedServer [GSS] Script Date: 11/30/2022 8:51:50 AM ******/ EXEC master.dbo.sp_addlinkedserver @server = N'GSS', @srvproduct=N'GSS', @provider=N'MSDASQL', @datasrc=N'GSS' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'GSS',@useself=N'False',@locallogin=NULL,@rmtuser=N'REMOTEUSER',@rmtpassword='########' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'collation compatible', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'data access', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'dist', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'pub', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'rpc', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'rpc out', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'sub', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'connect timeout', @optvalue=N'0' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'collation name', @optvalue=null GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'lazy schema validation', @optvalue=N'false' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'query timeout', @optvalue=N'0' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'use remote collation', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'remote proc transaction promotion', @optvalue=N'true' GO
优化方案
1. 调整链接服务器配置参数
- 启用
lazy schema validation:避免每次查询都远程拉取表结构,减少额外开销,执行以下脚本修改配置:
USE [master] GO EXEC master.dbo.sp_serveroption @server=N'GSS', @optname=N'lazy schema validation', @optvalue=N'true' GO
- 检查排序规则兼容性:如果GSS与SQL Server的排序规则一致,将
collation compatible设为true,可提升查询性能。
2. 优化查询逻辑
- 确保远程表有合适索引:确认GSS端
ORDER_HEADER表的RECORD_TYPE字段已创建索引,让远程查询能快速过滤数据,减少传输行数。 - 仅查询必要字段:杜绝
SELECT *,只获取业务需要的字段,降低数据传输量。 - 添加分页逻辑:若无需一次性获取全部4000行,可在OPENQUERY的远程语句中加入分页,分批次获取数据。
3. 尝试替代查询方式
- 使用OPENROWSET直接查询:语法示例如下,部分场景下性能优于OPENQUERY:
SELECT ORDER_NO FROM OPENROWSET('MSDASQL', 'DSN=GSS;UID=REMOTEUSER;PWD=########', 'SELECT Order_No FROM ORDER_HEADER WHERE RECORD_TYPE = ''A''')
- 定期同步数据到本地:如果对数据实时性要求不高,可通过ETL工具或定时作业将GSS数据同步到SQL Server本地表,查询本地表速度会大幅提升。
4. 排查底层环境问题
- 升级ODBC驱动:确保使用的Microsoft OLE DB Provider for ODBC Drivers是最新版本,旧驱动可能存在性能缺陷。
- 检查网络状态:排查SQL Server与GSS服务器之间的网络延迟、丢包情况,网络瓶颈会直接导致查询缓慢。
内容的提问来源于stack exchange,提问作者whatwhatwhat
相关产品推荐
相关产品推荐

