SQL Server 查詢鏈接服務器上的數據有兩種常用的方法:
1. 通過4部分名字(fourt-part name)直接查詢。例如:
SELECT * FROM JDE_LINKED.S10B3026.RTVTCOM.F0005 WHERE DRSY = '41' AND DRRT = 'S1'
這種方式的優點就是直觀、方便,還可以傳遞參數給where字句,靈活。
這種方式的最大缺點就是:影響鏈接服務器對查詢進行優化。查詢從鏈接服務器返回所有行,然后才在本地服務器進行篩選等操作。
從估計的執行計划來看,這里有一個Compute Scalar和一個Filter操作,這兩個操作本來可以在鏈接服務器上執行的。雖然這兩個操作的相對成本只有0%,但是由於這兩個操作沒有在鏈接服務器上執行,鏈接服務器不能優化查詢,而只能執行表掃描。由於SQL Server無法對遠程查詢進行優化(鏈接服務器不一定也是SQL Server, 可能是Oracle, DB2或者其它),所以從這個執行計划中看不出來是否執行了表掃描。
2. 通過OpenQuery函數查詢。
SELECT * FROM OPENQUERY(JDE_LINKED, 'SELECT DRKY,DRDL01 FROM RTVPCOM.F0005 WHERE DRSY = ''41'' AND DRRT = ''S1'' ')
這種方式的優點是允許連接服務器對查詢進行優化,只需要從鏈接服務器返回滿足篩選條件的記錄(可能只是1%記錄)。以這個語句為例,DRSY和DRRT字段上有索引,連接服務器可以較少的IO讀取,快速地返回滿足條件的記錄。以下是估計的執行計划:
這種方式的缺點是: 不能傳遞參數給查詢。由於OPENQUERY函數不支持變量,所以也不能動態構建查詢語句傳遞給OPENQUERY。當然,可以使用sp_executesql系統存儲過程執行動態SQL語句,但是會使得查詢變得更復雜,可讀性下降。