• ベストアンサー

AccessからOracleへの外部結合

AccessのテーブルからOracleのテーブルに外部結合した場合、遅くなるのはなぜでしょうか。対策はありますか。 AccessのテーブルからOracleのテーブルとほぼ同じ内容のサーバー上のAccessのテーブルに外部結合しても遅くない(数秒)ですがOracleのテーブルに外部結合すると30秒以上かかります。Accessの結合元のテーブル約3万件、Orcaleのテーブル約25万件です。 Oracleのテーブルに内部結合した場合は数秒です。 Access2000/Oracle8.0.5です。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>ただしOracleのリンクテーブル同士を結合した場合は、 >さほど遅くなっていないように思われます。 >(別のデータなので単純に比較できませんが。) 同一のデータベースの場合、Jetが結合したSQL文を 投げるみたいでした。これなら特に遅くなく結果は帰ってきますね。 ただ、違うODBCデータソースが指定されているリンクテーブル同士の結合ですとやっぱり遅くなります。

mylifeasdog
質問者

お礼

ありがとうございます。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>外部結合先をAccessにした場合と処理が異なるということでしょうか。 そういうことになります。 mdb中のテーブル同士の外部結合でしたら、そのテーブルを読みながら結合を行うことができますが、外部のDBのデータの場合、テーブルを外部結合するための効率的なリードが不可能なため、一旦結合対象となるすべてのレコードをローカルのメモリに展開します。 #この時点でwhere句にしてした条件に合致しないものは無視されますが。 このために遅くなります。 実行しているPCのメモリを増やせば多少は速くなると思いますが。 一番速いのはAccessのデータをOracleに入れて、パススルークエリーで実行することです。 こうすれば、高負荷の結合処理がサーバ上のCPUで行われるので、非力なPCでも高速に結果を取得可能です。 Oracelのリンクテーブル同士をAccessで結合させても結局結合処理はjetが行うことになりローカルのCPUを使うのであまり速くはありません。

mylifeasdog
質問者

お礼

回答ありがとうございます。 参考になりました。 ただしOracleのリンクテーブル同士を結合した場合は、さほど遅くなっていないように思われます。(別のデータなので単純に比較できませんが。)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

全件をローカルに取得してきてjetがクライアントのCPUを使用して結合させているから遅いんです。

mylifeasdog
質問者

お礼

回答ありがとうございます。 外部結合先をAccessにした場合と処理が異なるということでしょうか。

回答No.1

「外部結合」というのは、Access でいうところの「リンクテーブル」のことでしょうか? Oracle のテーブルを「外部結合」するとき、ODBC を使われているのでしょうか?ODBC を使用せずに、パススルー・クエリーにすればいくらか改善されると思います。 それと、これは試してないので推測なのですが、Access のテーブルの場合は、画面に表示できる範囲の件数(数10件程度)を表示するまでは早いが、最後尾のレコードにジャンプしようとすると待たされるということはありませんでしょうか?そうだとすると、Access の場合、一度に読み込むのではなく、画面表示に必要な部分だけを先に読み込んでおいて、それ以外のデータは要求があったときに読み込まれるというようなことがされているような気がします。

mylifeasdog
質問者

お礼

回答ありがとうございます。 ODBC接続をしています。 フォームを開く際にデータソースのクエリーが呼ばれますが初期段階では1件も表示しないようになっています。(「データ入力用」プロパティが"はい")

関連するQ&A