在第一個使用「點」符號的示例中,使用了客戶端遊標引擎,並且本地評估了大部分內容。如果您從大型表中選擇並使用WHERE子句,則記錄將從遠程數據庫本地下拉。一旦數據被拉過鏈接服務器,那麼只有WHERE子句在本地應用。通常這個序列是一個性能問題。遠程數據庫上的索引基本上是無用的。
或者,當您使用OPENQUERY時,SQL Server會將sql語句發送到目標數據庫進行處理。在處理過程中,會利用表中的任何索引。在將結果集發送回SQL Server之前,還會在Oracle端應用where子句。
根據我的經驗,除了最簡單的查詢,OPENQUERY會給你更好的表現。
我會建議使用OpenQuery的一切爲了上述原因。
使用OpenQuery時可能已經遇到的一個難點是單引號。如果發送到遠程數據庫的sql字符串需要在字符串或日期日期周圍使用單引號,則需要轉義它們。否則,他們無意中終止了sql字符串。
這裏是我,每當我在OPENQUERY語句處理變量鏈接的服務器採取單引號問題,護理使用的模板:
DECLARE @UniqueId int
, @sql varchar(500)
, @linkedserver varchar(30)
, @statement varchar(600)
SET @UniqueId = 2
SET @linkedserver = 'LINKSERV'
SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL'
SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', '
SET @Statement = @Statement + '''' + @SQL + ''')'
EXEC(@Statement)