2009-02-26 17 views
0

私は大規模なOracle DBへの反対のMicrosoft SQL ServerのStudioのクエリウィンドウに直接T-SQLクエリを使用していますし、私のSQLサーバーは、2005年オラクルDBとT-SQLを使用して

である私はとしてリンクサーバーを作成しましたmyOracleServer。次のT-SQLクエリを使用します。

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

1回の呼び出しで1分以上かかります。小さなサイズのテーブルの場合はOKですが、Oracle側のMyTableは非常に大きく、数百万行のデータがあります。

私が知ったのは、OPENQUERYを使用して、SQLクエリをパススルーとして呼び出すことができるということです。結果は非常に高速です。実行時間は00:00:02です!

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

問題は、クエリが定数文字列ではないということです。

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

OPENQUERYはクエリ文字列も式も変数をサポートしていません。

高速パフォーマンスでOracleにパススルー・クエリを取得する方法はありますか。

答えて

0

私はSQL 2005サーバーからOracleデータベースにクエリを渡そうとすると、遅さの問題を解決するソリューションを見つけ出すと思います。

3つの方法があります。オラクル側のテーブルには、例えば、データの3M行で、実行時間が非常に長い、大きなものである場合

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

最初の1のようなものです。今日、私は私の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と日付で構築する必要があるからです。、

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; 

ここでのキーポイントは、リモートサーバーまたはリンクサーバーを指定するには、ATとのEXECを使用することです:

良いニュースは、私は、問題に優れたソリューションを第三の方法を見つけたということです@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は変数をサポートしています。 OPENQUERYについてはmsdnを参照してください。 –

+0

タイプミスで申し訳ありません:サポートしていません... –

+0

ええ、私はそれを見ました。箱の外では、ステートメントで「temp」sprocを作成することができますが、perfの違いが絶対に驚くべきものでなければ、少し過度のことになります。私はCLR procがオプションかどうか疑問に思います。 –

0

のようなものを試してみてください、あなたはそのクエリに基づいてビューを作成しようとしたことがありますか?それが動作すれば、Viewをローカルテーブルのように使用できるはずです。

+0

それがローカルテーブルとして機能する場合は、それが原因で発生する可能性があります。パススルークエリが好きですが、OPENQUERYのconstでない場合は動作しません。 –

関連する問題