none
ORACLEデータを取り込みたい RRS feed

  • 質問

  • 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は詳しくないので、担当者に何を確認していいのかもわかっていません。何か、設定が必要でしょうか?

    どちらか、ひとつでも解決するとありがたいので、よろしくお願いします。

     

    2010年5月18日 22:55

回答

  • 前半の問題に対して2点ほど切り分け案を。

    • 実行したいクエリをopenqueryでラップしても同じようになるか
    • 実行したい検索をOracle側だけで実行しても索引を使わないか
    http://msdn.microsoft.com/ja-jp/library/ms188427.aspx
    • 回答の候補に設定 山本春海 2010年5月21日 5:58
    • 回答としてマーク 山本春海 2010年5月25日 8:53
    2010年5月19日 9:15
    モデレータ
  • 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

     

    • 回答の候補に設定 山本春海 2010年5月21日 5:58
    • 回答としてマーク 山本春海 2010年5月25日 8:53
    2010年5月19日 9:48

すべての返信

  • 前半の問題に対して2点ほど切り分け案を。

    • 実行したいクエリをopenqueryでラップしても同じようになるか
    • 実行したい検索をOracle側だけで実行しても索引を使わないか
    http://msdn.microsoft.com/ja-jp/library/ms188427.aspx
    • 回答の候補に設定 山本春海 2010年5月21日 5:58
    • 回答としてマーク 山本春海 2010年5月25日 8:53
    2010年5月19日 9:15
    モデレータ
  • 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

     

    • 回答の候補に設定 山本春海 2010年5月21日 5:58
    • 回答としてマーク 山本春海 2010年5月25日 8:53
    2010年5月19日 9:48
  • NOBTAさん、ElanLiacさん、

    ご教授、ありがとうございます。

    OPENQUERYが、使えるんですね。大変、参考になりました。
    これを使用して、SQL文を実行するとインデックスが、使用されているようで、高速のレスポンスになりました。
    Integration Servicesでも使用でき、この方法だとジョブに設定して、スケジュール化することにも成功しました。
    これで、問題は解決しましたので、この方法で、開発を行いたいと思います。

    これで、問題は、解決したのですが、リンクサーバ経由で、SQLSERVER直だとインデックスが使えない問題とジョブがエラーになる問題は、
    気になります。もし、ご存知の方が、いらっしゃれば、教えてください。優先度は、低くてけっこうです。

    初めての投稿でしたが、NOBTAさん、ElanLiacさんのおかげで、無事解決しました。

    今後とも、よろしくお願いします。

     

    2010年5月20日 5:12
  • 今すぐに思いつくのは、プロバイダオプションで以下のオプションを有効化して、どうかいうところでしょうか。

    SSMS - サーバーオブジェクト - リンクサーバー - プロバイダ - 該当のプロバイダ - 右クリック - プロパティ

    動的パラメータ、入れ子になったクエリ、InProcess 許可にチェック

    SSMS - サーバーオブジェクト - リンクサーバー - 作成したリンク - 右クリック - プロパティ

    サーバーオプション: リモート照合順序を使用 : True

    ※個人的には、OPENQUERY にて、SQL Server 以外のDBについては、処理を任したほうが良いような気がします。

    2010年5月20日 7:19
  • NOBTAさん、

    アドバイス、ありがとうございます。

    設定は、「動的パラメータ、入れ子になったクエリ」が、チェックされてなかったので、チェックしてみましたが、変わりませんでした。

    そんなに変わったことをしているわけではないので、単純な設定ミスだと思っていますので、こういうアドバイスは、初心者なので、助かります。

    また、OPENQUERYを使うのが、いいのか、少し疑問に思っていましたので、個人的見解でも安心しました。

    今後とも、よろしくおねがいします。

     

    2010年5月21日 3:14