2009-02-26 73 views
0

我使用T-SQL查詢直接在Microsoft SQL Server Studio的針對一個大型Oracle數據庫的查詢窗口,我的SQL服務器2005使用T-SQL和Oracle數據庫

我創建了一個鏈接服務器myOracleServer。通過使用以下T-SQL查詢:

SELECT COUNT(*) FROM myOracleServer..owner.myTable WHERE id = 1000 AND Dt = '2009-02-26' 

只需要一個電話就花費1分多鐘。對於小型表而言,它是可以的,但Oracle側的my​​Table非常大,有數百萬行數據。

我發現的是,我可以使用OPENQUERY與SQL查詢進行類似的調用作爲傳遞函數。結果非常快。執行時間是00:00:02!

SELECT * FROM OPENQUERY(myOracleServer, 'SELECT COUNT(*) FROM owner.myTable WHERE ...'); 

我遇到的問題是查詢不是一個常量字符串。我可以在查詢更改ID和dt值,是這樣的:

'SELECT COUNT(*) FROM ownwer.myTable WHERE id = ' + CAST(@id AS VARCHAR)... 

OPENQUERY不支持變量作爲查詢字符串,也不表達。

是否有任何其他方式讓傳遞查詢快速性能到Oracle?

回答

0

我想我找出解決緩慢問題的解決方案,當我嘗試從SQL 2005服務器向Oracle數據庫傳遞查詢時。

有三種方法可以做到這一點。該第一個是一樣的東西:

SELECT COUNT(*) FROM myOracleServer..owner.myTable 
    WHERE id = 1000 AND Dt = '2009-02-26' 

如果Oracle方面的表是一個大的,用的數據。例如3M行,執行時間很長。今天我又試了一下我的SQL服務器上,並花了大約2'44" 只是一個查詢(也許在工作日的表是非常繁忙)。

第二種方法是使用OPENQUERY,正如我所說在我的問題:

SELECT COUNT(*) FROM OPENQUERY(myOracleServer, N'SELECT COUNT(*) FROM 
    owner.myTable WHERE id = 1000 AND Dt = TO_DATE(''2009-02-26'')'); 

這是非常快,我再次運行它,執行時間爲00:00:00,驚人的快。然而,用這種方法的問題是,OPENQUERY不支持變量作爲!查詢

其實我找到了這個方法,並且在昨天晚上工作的時候非常激動我寫了一個bl og on this issue昨晚。今天早上,當我試圖把它變成生產(一個存儲過程)時,我無法使用OPENQUERY,因爲在我的情況下,變量查詢必須建立在id和date上。

的好消息是,我找到了第三條道路,一個很好的解決這一問題:

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + 
    CAST(@id AS VARCHAR) + N' AND Dt = TO_DATE(''' + @dt + 
    N''', ''yyyy-mm--dd'')'); 
EXEC (@sql) AT myOracleServer; 

這裏的關鍵點是使用EXEC與AT指定遠程服務器或鏈接服務器,並且不要忘記使用()來包圍@sql變量。執行時間是00:00:00!

我的沼氣將在今晚更新。

0

嘗試這樣的事情

DECLARE @sql varchar(2000) 
SET @sql = SELECT COUNT(*) FROM owner.MyTable WHERE id = " + CAST(@id to varchar(9)) 
SELECT * FROM OPENQUERY(myOracleServer, @Sql) 
+0

正如我所說OPENQUERY確實支持變量。請參閱msdn for OPENQUERY。 – 2009-02-26 17:10:06

+0

抱歉,錯字:不支持... – 2009-02-26 17:11:27

0

您是否嘗試過創建一個基於查詢視圖?如果可行,你應該可以像使用本地表一樣使用視圖。