2010-08-26 98 views
6

在我的SQL 2005服務器上,我有一臺鏈接服務器通過OraOLEDB.Oracle提供程序連接到Oracle。SQL 2005-鏈接服務器到Oracle查詢極其緩慢

如果我運行通過4部分組成的標識符,像這樣的查詢:

SELECT * FROM [SERVER]...[TABLE] WHERE COLUMN = 12345 

它接管一分鐘才能完成。如果我運行相同的查詢,如下所示:

SELECT * FROM OPENQUERY(SERVER, 'SELECT * FROM TABLE WHERE COLUMN = 12345') 

它立即完成。是否有一個設置我錯過了某個地方讓第一個查詢在相當長的一段時間內運行?或者我堅持使用openquery?

回答

10

在第一個使用「點」符號的示例中,使用了客戶端遊標引擎,並且本地評估了大部分內容。如果您從大型表中選擇並使用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)