私はMicrosoft SQL Server 2005を使用しています。SQL ServerとOracleデータベース間でデータを同期する必要があります。私が必要とする最初の事は、特定のフィルタ(ここで私は単純な例としてIDを使用して)とOracle側のデータの数を調べることです。EX linked server AT linked servers Oracleデータベース
SELECT COUNT(*) FROM oracleServer..owner.table1 WHERE id = @id;
私が問題にしているのは、サーバーまたはOracleの並んでいるテーブルが4M行のデータで非常に大きいことです。上記のクエリは、データを取得するのに約2分かかりました。このコードは単なる単純なものです。実際に私のSPには、更新するいくつかの他のクエリがあり、並べ替え済みのサーバからSQLサーバにデータを挿入します。大規模なOracleデータベースを使用するには、SPに数時間または10時間以上かかることがありました。したがって、サーバーが並んでいるT-SQLは私には良くない。
最近、OPENQUERYとEXEC(...)AT linedServerが見つかりました。 OPENQUERY()は非常に高速です。同じ結果を得るまでに約0時間かかりました。ただし、変数クエリまたは式はサポートされていません。クエリはリテラル定数文字列でなければなりません。
EXEC()は、Oracleにパススルークエリと同じ方法です。それは速いです。例:
EXEC ('SELECT COUNT(*) FROM owner.table1 WHERE id = ' + CAST(@id AS VARCHAR))
AT oracleServer
問題は、結果COUNT(*)を戻す方法です。私はwebとmsdnでgoogleの例を試しました。私が見つけることができるのは、SQLまたはExpressSQLのlinedServerの例です。
EXEC ('SELECT ? = COUNT(*) FROM ...', @myCount OUTPUT) AT expressSQL
このクエリはOracleでは機能しません。 Oracleには、この方法で出力として値を設定することができそうです:
SELECT COUNT(*) INTO myCount ...
私はこれを試していない:これらの作業の
EXEC ('SELECT COUNT(*) INTO ? FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT COUNT(*) INTO : FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT : = COUNT(*) FROM ...', @myCount OUTPUT) AT oracleServer
なし。 Oracleサーバー上で実行可能なクエリがないというエラーメッセージが表示されます。
私は仕事をするための.Net SQL Serverプロジェクトを書くことができました。その前に、oupputパラメータとして値を渡す方法があるかどうか疑問に思っています。その結果、私のSPにより良いパフォーマンスのT-SQLコードを置くことができますか?
より10速い^多くは最近、私はこの方法では1、興味深い問題を発見しました。私はExec()を使って詳細を掲載しました(続き)(http://davidchuprogramming.blogspot.com/2009/03/using-exec-at-continued.html)。 –