Sql 为什么来自远程表的联接速度如此之慢?

Sql 为什么来自远程表的联接速度如此之慢?,sql,sql-server,sql-server-2008,remote-server,Sql,Sql Server,Sql Server 2008,Remote Server,假设我有这样一个问题: SELECT L.id, L.name, R.phone FROM users L JOIN [remoteServer].[dbo].[phoneNumbers] R ON R.fk_id=L.id WHERE L.id=12345 在SQL Server 2008中,如果我显示执行计划,我会看到本地SQL Server查询整个远程表(SELECT id,phone FROM[remoteServer].[dbo].[phoneNumbers]),然后在本地应用过滤器

假设我有这样一个问题:

SELECT L.id, L.name, R.phone
FROM users L
JOIN [remoteServer].[dbo].[phoneNumbers] R ON R.fk_id=L.id
WHERE L.id=12345
在SQL Server 2008中,如果我显示执行计划,我会看到本地SQL Server查询整个远程表(
SELECT id,phone FROM[remoteServer].[dbo].[phoneNumbers]
),然后在本地应用过滤器

它为什么不查询筛选的远程表(
选择id,电话来自[remoteServer].[dbo].[PhoneNumber],其中id=12345
),因为只会使用与
id
匹配的记录


我想我的问题是:既然SQL Server在默认情况下不这样做,我怎么能做到这一点呢?

我对链接服务器的观察结果是,当您使用这种语法时

server.database.schema.table
将检索该表的全部内容。之后进行任何过滤


解决方案是使用openquery。

本地实例对外部对象的结构没有任何线索。这就像把手伸进一个黑匣子,让你从一张桌子上取回所有的“史密斯”。你不知道从哪里开始,所以你先把它全部拉出来,这样你就可以查看整个表。

也许你可以探索
连接提示。从未使用过,但可能会有所帮助<代码>远程
提示应该可以完成这项工作。@a1ex07你说得对。我只是在这里试过,这就是方法。你为什么不使用别名和前缀?我不知道哪些列来自哪个表。您可能可以使用
EXISTS
或子查询或
REMOTE
提示(我在这里写了一个关于这些的提示,但发现在我的测试用例中没有帮助:)。现在我不能提出任何建议,因为您的代码既不完整也不自我记录。我添加了列前缀以使代码更清晰。L是本地表,R是远程表。我在R.fk_id=L.id列上加入,筛选器是L.id=12345。也许我遗漏了一些东西,但在我看来,它应该足够聪明,能够发现远程查询应该使用R.fk_id=12345进行过滤