2017-04-06 16 views
0

我有一个奇怪的情况。我们有一个带有Prod端和Dev端的AS400(同一台机器,2个NIC卡)从一个生产SQL Server中,我们运行一个来自使用链接服务器的MS-SQL服务器的查询,我将其称为'as400'查询确实有3个连接,执行计划看起来大致类似于[远程查询] =>获得结果。它执行远程服务器上的连接(Production AS400)这将在不超过0:00:02(2秒)内执行。其中一个连接表有391万行。它拉动100行 - 与另一张桌子相连。现在链接服务器的陌生性 - 来自加入的性能

,这样会很奇怪。在同一台机器的Dev侧,运行在不同的SQL Server上,进入另一个NIC卡,使用不同的数据库(开发人员)执行相同的查询,执行计划完全不同!它是:

[查询1]哈希匹配(内部连接)与[QUERY2]与[QUERY3]与[Query4]

期待每个查询返回10,000行(我敢肯定,Hash哈希值,这只是使用它作为猜测,因为它不知道实际的行,因为它是远程的)。看起来要做的是在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服务器似乎从没有工作(而查询23小时运行)的机器开到AS400每秒连接5 - 我不明白,我不是100%确定它与这个问题有关,但它是由AS400提出的。

回答

0

我鄙视链接服务器因为这个原因(以及许多其他)。我一直使用openquery()和使用sp_executesql来帮助防止SQL注入。

还有就是这个在这里提到:including parameters in OPENQUERY

0

没有看到查询和执行计划听起来就像远程访问服务器上的统计信息时,这是权限的问题。对于查询引擎,以充分利用所有可用的统计数据,并正确地构建一个计划,确保用于连接到链接服务器的数据库用户链接服务器上执行下列操作之一:

  1. 的所有者表(s)。
  2. sysadmin固定SERVER角色的成员。
  3. db_owner固定DATABASE角色的成员。
  4. db_ddladmin固定DATABASE角色的成员。

要检查你使用连接到链接服务器使用对象资源管理器是什么数据库用户...

展开服务器\实例>服务器对象>链接服务器>右键点击您的链接的服务器,然后选择属性,然后转到安全页面。

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

查看以下文章以获取更多详细信息。希望这可以帮助!

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

+0

如果它确实是一个权限问题与得到的统计数据,我写了一篇博客文章如何让周围无需任何上述权限(有很多的文章中警告,虽然) 。 http://www.spartansql.com/2012/10/cardinality-estimates-over-linked-server.html –

+0

@BenThul伟大的文章!我不知道你可以用这种方式绕过烫发。感谢分享。 – Jon