我有一个奇怪的情况。我们有一个带有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提出的。
如果它确实是一个权限问题与得到的统计数据,我写了一篇博客文章如何让周围无需任何上述权限(有很多的文章中警告,虽然) 。 http://www.spartansql.com/2012/10/cardinality-estimates-over-linked-server.html –
@BenThul伟大的文章!我不知道你可以用这种方式绕过烫发。感谢分享。 – Jon