1

想象一下,我有这个查询:

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 服务器查询整个远程表 ( SELECT id, phone FROM [remoteServer].[dbo].[phoneNumbers]),然后在本地应用过滤器。

为什么它不查询过滤的远程表(SELECT id, phone FROM [remoteServer].[dbo].[phoneNumbers] WHERE id=12345),因为只会使用匹配的记录id

我想我的问题是:我怎样才能做到这一点,因为 SQL Server 默认情况下不这样做?

4

2 回答 2

2

我对链接服务器的观察是,当您使用此语法时

server.database.schema.table

检索该表的全部内容。之后进行任何过滤。

解决方案是使用openquery。

于 2013-10-03T00:40:00.363 回答
0

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

于 2013-10-03T02:00:59.633 回答