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