2013-10-02 44 views
0

想象一下,我有這個疑問:爲什麼來自遠程表的連接如此之慢?

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

也許你可以探索'加入提示'。從未使用過它,但它可能有幫助。 http://technet.microsoft.com/en-us/library/ms173815.aspx –

+1

'REMOTE'提示應該可以完成這項工作。 – a1ex07

+0

@ a1ex07你是對的。我在這裏試過了,這就是要走的路。 –

回答

1

我對鏈接服務器的觀察,就是當你使用這個語法

server.database.schema.table 

該表的全部內容進行檢索。任何過濾都是在之後完成的。

解決方案是使用openquery。

0

本地實例對外部對象的結構沒有任何線索。這就像進入一個黑盒子,並要求你從一張桌子上取回所有「史密斯」。你不知道從哪裏開始,所以你先把它全部拿出來,這樣你才能查看整個表格。

+0

我加入欄目R.fk_id = L.id,過濾器是L.id = 12345。也許我錯過了一些東西,但在我看來,它應該足夠聰明,以確定遠程查詢應該使用R.fk_id = 12345進行過濾 –

相關問題