トップ回答者
ORACLEデータを取り込みたい

質問
-
SQLSERVER2005から、ORACLE9iへリンクサーバ経由で、接続しているのですが、パフォーマンスが悪く使えません。
Oracle側には、インデックスを持っていますが、これを使用していないようです。このため、ORACLE用のプロバイダ オプションの
「アクセスパスとしてのインデックス」にチェックをして、実行していますが、以下のようなエラーが返されて、インデックスを使えません。
「メッセージ 7319、レベル 16、状態 1、行 1」
「リンク サーバー "ORA_TEST" の OLE DB プロバイダ "MSDAORA" から、無効なブックマーク序数 0 の "NON-CLUSTERED and NOT INTEGRATED" インデックス "IF_INFO_TABLE_1"が返されました。」
Oracleのインデックスを使用するためには、何か設定がいりますでしょうか?また、直接OLEDB for Oracleで、Oracleに接続をしていますが、Integration Servicesで、データ取得をできましたが、その処理を手動で、実行すると問題なく処理できるのですが、ジョブ設定にスケジュールして実行するとエラーになります。Oracle接続していない処理は、うまく処理できているので、ログインの問題だと思っていますが、Oracleは詳しくないので、担当者に何を確認していいのかもわかっていません。何か、設定が必要でしょうか?
どちらか、ひとつでも解決するとありがたいので、よろしくお願いします。
回答
-
OPENQUERY を使用すれば、実行プランがOracle 側にて作成されるため、Oracle 環境でインデックスが使用できているのであれば、パフォーマンス問題を解決できる可能性があると思います。
ただ、Oracle 9i プロバイダ以降は、リンクサーバーでは、Microsoft としてはサポート外となるみたいで、何らかの問題が発生したとしても、調査を実施して頂けない可能性があるみたいです。 ちなみに ADO.Net では、Oracle 9i 以降もサポートされるみたいです。
OPENQUERY (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms188427.aspx
SQL Server でテスト済みの OLE DB プロバイダ
http://msdn.microsoft.com/ja-jp/library/ms187072.aspx
すべての返信
-
OPENQUERY を使用すれば、実行プランがOracle 側にて作成されるため、Oracle 環境でインデックスが使用できているのであれば、パフォーマンス問題を解決できる可能性があると思います。
ただ、Oracle 9i プロバイダ以降は、リンクサーバーでは、Microsoft としてはサポート外となるみたいで、何らかの問題が発生したとしても、調査を実施して頂けない可能性があるみたいです。 ちなみに ADO.Net では、Oracle 9i 以降もサポートされるみたいです。
OPENQUERY (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms188427.aspx
SQL Server でテスト済みの OLE DB プロバイダ
http://msdn.microsoft.com/ja-jp/library/ms187072.aspx
-
NOBTAさん、ElanLiacさん、
ご教授、ありがとうございます。
OPENQUERYが、使えるんですね。大変、参考になりました。
これを使用して、SQL文を実行するとインデックスが、使用されているようで、高速のレスポンスになりました。
Integration Servicesでも使用でき、この方法だとジョブに設定して、スケジュール化することにも成功しました。
これで、問題は解決しましたので、この方法で、開発を行いたいと思います。これで、問題は、解決したのですが、リンクサーバ経由で、SQLSERVER直だとインデックスが使えない問題とジョブがエラーになる問題は、
気になります。もし、ご存知の方が、いらっしゃれば、教えてください。優先度は、低くてけっこうです。初めての投稿でしたが、NOBTAさん、ElanLiacさんのおかげで、無事解決しました。
今後とも、よろしくお願いします。
-
今すぐに思いつくのは、プロバイダオプションで以下のオプションを有効化して、どうかいうところでしょうか。
SSMS - サーバーオブジェクト - リンクサーバー - プロバイダ - 該当のプロバイダ - 右クリック - プロパティ
動的パラメータ、入れ子になったクエリ、InProcess 許可にチェック
SSMS - サーバーオブジェクト - リンクサーバー - 作成したリンク - 右クリック - プロパティ
サーバーオプション: リモート照合順序を使用 : True
※個人的には、OPENQUERY にて、SQL Server 以外のDBについては、処理を任したほうが良いような気がします。