2010-02-24 66 views
3

更新:经过一些实验后,似乎速度慢的是我调用“SELECT min(列)FROM theTableValuedFunction()“。SQL Server 2005:选择从远程服务器连接表运行速度太慢 - 当我“选择最小(列)”

我将调用本地服务器ServerLocal和其他远程服务器ServerForeign。我在上ServerLocal表值函数的SQL查询,看起来像这样:

SELECT columns 
FROM ServerForeign.database.tableA 
JOIN ServerForeign.database.tableB ON columns 
JOIN ServerForeign.database.tableC ON columns 
JOIN ServerForeign.database.tableD ON columns 
JOIN ServerForeign.database.tableE ON columns 
JOIN ServerForeign.database.tableF ON columns 
WHERE conditions 

因此,这里是我的问题:

当我运行它,并ServerLocal整个查询发送到ServerForeign并问做一个连接本身并在一次操作中取回结果,还是抓取整个表格,不必要地传输所有内容,只是将其过滤掉/将它们连接到ServerLocal上?

表值函数中的“WHERE条件”非常笼统;在表值函数被调用的各个地方,它在条件下进一步适用。通过将那些子句移动到表值函数代码中,还是没有区别,是否有任何效率?

将表值函数放在ServerForeign上并从ServerLocal中调用该函数会有什么好处,还是只会传输数据会产生相同的缓慢?如果我将表值函数移动到ServerForeign,并且ServerLocal在它调用表值函数的位置应用了WHERE子句,那么SQL Server是否足够聪明,可以将该WHERE子句从ServerLocal传输到ServerForeign,并使用它来减少行传输,还是它无意识地返回所有这些行,并删除不匹配的行?

由于各种外部原因,我宁愿不必在ServerForeign上放置任何代码。如果有办法运行ServerLocal上的所有SQL代码,并仍然有效地处理来自ServerForeign的数据,那将是更可取的。

回答

1

我自己遇到了这个。很多时候,远程表将被复制到本地数据库以执行查询。尝试删除远程数据库中的任何“where”子句条件,并加快速度。

显然这不是一个解决方案,但大多数建议在远程数据库上创建SP或视图,然后调用它。

因此,在您的情况下,如果您创建视图,请确保WHERE子句位于远程服务器上,至少对于来自远程表的列。

+0

我相信当你汇总(例如MIN)时,它必须构建整个结果集,然后最后汇总它。如果查询上有其他WHERE条件,SQL Server将尝试过滤链接服务器上的结果,从而降低通过网络带回的数据量。如果标准的“WHERE TableB.ID <10”的标准,那么我认为查询会快得多,但是SQL不能在不拉回所有内容的情况下进行聚合。 – SqlRyan 2010-02-25 14:18:22

1

如果您执行了执行计划(SQL Server Manager Studio中的Control-L),您将会看到它提交的内容。这些步骤将被称为“远程查询”,如果将鼠标悬停在上面,它将显示正在发送的远程查询。

+0

查询计划只是说“远程查询:100%” – Dennis 2010-02-24 18:34:06

+0

但是,如果您将鼠标悬停在查询上,它将为您提供发送到远程服务器的文本。在你的例子中,它只是你的查询的副本,减去“ServerForeign”的名字,因为所有的表都是远程定位的。如果您在此网站上添加了任何过滤器,则它会在通过它时将该过滤转换为远程查询。只要有可能,我相信SQL Server会要求尽可能小的结果集以尽量减少网络流量,所以如果它有远程过滤和取回结果的选项,它会选择这样做。 – SqlRyan 2010-02-24 18:54:05

1

我发现在这种情况下,将远程数据本地缓存在临时表中可能会更快,特别是如果您可以在使用where子句过滤它时进行过滤。