链接服务器的异常 - 来自联接的性能

时间:2017-04-06 20:38:53

标签: sql-server join linked-server

我有一个奇怪的情况。我们有一个带有Prod端和Dev端的AS400(相同的机器,2个nic卡)从生产SQL Server,我们从使用链接服务器的MS-SQL服务器运行查询,我将调用& #39; AS400'查询执行3次连接,执行计划看起来大致类似于[Remote Query] =>得到了结果。它在远程服务器上执行连接(Production AS400)这将在不超过0:00:02(2秒)的时间内执行。其中一个连接表具有391百万行。它拉了100行 - 连接到另一个表。

现在,它变得奇怪了。在同一台机器的开发端,运行在不同的SQL Server上,进入另一个NIC卡,使用不同的数据库(开发一个)执行相同的查询,执行计划是完全不同的!它是:

[查询1]哈希匹配(内连接)与[Query2]哈希与[Query3]哈希与[Query4]

期望每个查询返回10,000行(我确定它只是使用它作为猜测,因为它不知道实际的行,因为它是远程的)。它似乎正在做的是在query2上回溯3.91亿行,它需要>在我放弃并终止查询之前的23个小时。 (在SSMS中运行)

显然,MS SQL Server决定不将其作为单个查询传递给AS400。为什么呢?

我可以解决'通过使用OpenQuery(as400,cmd)来解决问题,但是它会打开我们的SQL注入,不能对查询进行简单的语法检查,以及其他我不喜欢的事情。使用OpenQuery进行查询需要6秒钟,并返回正确的数据。

如果我们通过重写我们在生产中使用的所有(工作,快速)查询来解决这个问题,那么它们也可以针对开发运行 - 它涉及很多努力,并且在实际生产中存在不足之处。

我尝试使用'遥控器'提示加入,但AS400不支持: - (

尝试查看SQL Server的配置/版本,但似乎也没有提供线索。 (SQL Server几乎相同的版本/相同,10.50.6000用于有效的版本,10.50.6220用于失败的版本(更新),还有10.50.6000用于另一个失败的版本。)

有人提出任何线索吗?想要解决这个问题,我们已经有几个人看了几个星期 - 包括数据库架构师和IBM AS400大师,以及我。 (到目前为止,我的OpenQuery是唯一有效的方法)

另外一点,MS服务器似乎是从不工作的机器每秒打开到AS400的连接5(查询运行23小时) - 我不明白,我和# 39; m不是100%肯定它与这个问题有关,但它是由AS400人提出来的。

2 个答案:

答案 0 :(得分:0)

我因此而鄙视链接的服务器(以及其他许多服务器)。我一直很喜欢openquery()并使用sp_executesql来帮助防止SQL注入。

这里提到了这一点:including parameters in OPENQUERY

答案 1 :(得分:0)

在没有看到查询和执行计划时,听起来这是访问远程服务器上的统计信息时的权限问题。要使查询引擎能够使用所有可用的统计信息并正确构建计划,请确保用于连接到链接服务器的db用户是链接服务器上的以下任一项:

  1. 桌子的拥有者。
  2. sysadmin固定SERVER角色的成员。
  3. db_owner固定DATABASE角色的成员。
  4. db_ddladmin固定DATABASE角色的成员。
  5. 要检查您用于连接到链接服务器的数据库用户,请使用对象资源管理器...

    展开Server \ Instance>服务器对象>链接服务器>右键单击链接服务器并选择属性,然后转到“安全性”页面。

    如果你没有在顶部显示登录(我不建议),那么选择底部的最后一个单选按钮,使用特定的安全上下文建立连接,并输入用户名和密码。适当的db用户。而不是使用' sa'在上面的#2或#3链接服务器上创建一个新的db用户并使用它。然后,每次使用链接服务器时,它都将连接必要的权限。

    查看以下文章了解更多详情。希望这有帮助!

    http://www.benjaminnevarez.com/2011/05/optimizer-statistics-on-linked-servers/