我有一台 SQL Server 2005 机器,其中 JDE DB2 设置为链接服务器。
由于某种原因,从这个盒子到 db2 盒子的任何查询的性能都很糟糕。
例如。以下需要 7 分钟从 Management Studio 运行
SELECT *
FROM F42119
WHERE SDUPMJ >= 107256
而在 iSeries Navigator 中运行需要几秒钟
有什么想法吗?我假设一些配置问题。
我有一台 SQL Server 2005 机器,其中 JDE DB2 设置为链接服务器。
由于某种原因,从这个盒子到 db2 盒子的任何查询的性能都很糟糕。
例如。以下需要 7 分钟从 Management Studio 运行
SELECT *
FROM F42119
WHERE SDUPMJ >= 107256
而在 iSeries Navigator 中运行需要几秒钟
有什么想法吗?我假设一些配置问题。
在某些搜索中,SQL Server 将决定将整个表拉到其自身,并对 SQL Server 中的数据进行排序和搜索,而不是将查询发送到远程服务器。这通常是排序规则设置的问题。
确保提供程序设置了以下选项:数据访问、排序兼容、使用远程排序
然后使用提供程序创建一个新的链接服务器并选择以下提供程序选项动态参数、嵌套查询、允许处理中
设置选项后稍微更改查询以获得新的查询计划。
It might be a memory issue on your SQL Server machine. I recently learned that linked server queries use memory allocation by the OS. Whereas native SQL Server queries use memory pre-allocated by SQL Server. If your SQL Server machine is configured to use 90% or more of the server's memory, I would scale that back a bit. Maybe 60% is the right place to be.
Another thing to check is the SQL Server processor priority. Make sure "Boost SQL Server priority" is not enabled.
I assume you are going through ODBC for access. Remember that you are not writing native db2 queries here, but instead ODBC sql queries. If you only need read-only data, you may want to try configuring your ODBC datasource to read-only mode (if that is an option).
在一个与 DB2 集成的项目中,我通过调用 OPENQUERY 函数的存储过程直接选择或查看替换了每个查询。
我的解释是 SqlServer 在应用 WHERE 条件之前获取整个表,而 OPENQUERY 将 SQL 语句直接传递给 db 驱动程序。
无论如何,修改后的性能是可以接受的。
我在将 DB2 作为链接服务器时遇到了几个问题。我不知道它是否会解决您的问题,但这是解决我的问题:
1) 在 ODBC 设置中的 EXECUTE 期间启用延迟关闭支持和预取 2) 在所有选择上添加“FOR FETCH ONLY” 3) 使用 SELECT * FROM OPENROWSET(LinkedServerName, 'SQL Command') 方法进行查询
我首先想到的是司机。几年前,我不得不将 DB2 链接到 SQL Server 2000,并且很难找到正确的驱动程序和设置参数的组合可以工作......
所以也许我因此而有偏见,但我会尝试升级或降级驱动程序或更改设置,以便 DB2 驱动程序可以运行 INPROC(如果它还没有这样做的话)。