想象一下,我有这个问题:
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没有这样做?
答案 0 :(得分:1)
我对链接服务器的观察是,当您使用此语法时
server.database.schema.table
检索该表的全部内容。之后进行任何过滤。
解决方案是使用openquery。
答案 1 :(得分:0)
本地实例对外部对象的结构没有任何线索。这就像进入一个黑匣子,并要求你从一张桌子上找回所有“史密斯”。你不知道从哪里开始,所以你先把它全部拿出来,这样你就可以查看整个表格。