別々のサーバーのテーブルに対してSQLを発行するには?

解決


Ru  2007-11-28 23:01:42  No: 28710

いつも参考にさせてもらっています。
少々困ってましてみなさんの知恵を借してください。

<環境>
WindowsXP  SP2
Delphi7
サーバー1:(OS400)  Delphi/400:あり
サーバー2:(OS400)  Delphi/400:なし

別々のサーバーのテーブルに対してJOINを行ったSQLを発行したいのですが,
一方のテーブルの認識ができないようです(TDataBaseは一つなので当たり前かもしれませんが)。
SQLでサーバーを認識させることはできないものでしょうか?
接続方法としてはBDE接続とADO接続で試してみました。
SQLで解決する方法はあるでしょうか?

また上記の処理が出来ないことも考え,
一度ローカル(Paradox)にテーブルデータ(フィールド数:約140)をコピーする方法も考えています。
(全てのテーブルをローカルに落とせば一応SQLは通るので・・・)
ただ,データ件数が9万件と多く処理時間がかかりすぎています。
私が処理した方法として以下の2つ試してみました。
・パターン1
 1.データソースを作成
 2.BDEを使用して接続
 3.コピー元と同じテーブル構成をローカルに作成
 4.TBatchMoveコンポーネントを使用してコピー
  ※結果:約2分30秒

・パターン2
 1.TADOConnectionにて接続
 2.TADOQuery.CursorLocationプロパティをclUserServerに設定
  (この設定がないとADOQueryオープン時に時間がかかる)
 3.コピー元と同じテーブル構成をローカルに作成
 4.INSERT INTO にて1件ずつデータをコピー
  ※結果:60分以上

他にデータのコピーを早くする手法をご存じ方はいませんでしょうか?

以上です。よろしくお願いします。


moru  2007-11-29 16:35:30  No: 28711

片方のテーブルをTDataSetなどへ読み込み、TFieldのLookupDataSetプロパティには,もう片方のテーブルを読み込ませたTDataSetなどを設定して、LookupDataSet側の項目をTField.FieldKindプロパティをfkLookupに設定したフィールドへ読み込ませる方法はどうでしょうか?
ただし、処理速度がどのくらいかは分かりませんし、実際に検証していませんので外していたらすみません。

何故、結合する必要があるのか分かりませんが、9万件のデータを同時にアクセスする必要がなければTClientDataSetなどへ必要分読み込んで処理しても良いのでないでしょうか?


Ru  2007-11-29 19:07:51  No: 28712

返信ありがとうございます。
検索キーによっては別々のテーブルに対象フィールドがある為,
結合した上でSQLを発行しなければならないと思いました。
ただ,SQLで完結した場合の方が早いかどうかは不明です。

※以下の実験では検索キーが別々のテーブルにあるため一度全てのデータをClientDataSetに落としています。
  DataSet間でINNER JOINみたいなことが出来ればいいんですが・・・

フィールドの参照設定を試してみましたが『この機能は使用できません』とメッセージがでました。
同じDatabaseを使用した場合は参照設定はできました。
別々のDatabaseを使用した場合がダメなのかもしれないので別途調べます。

各々のテーブルを一旦ClientDataSetに落としフィールドの参照設定を行うと
正常に値を読み込むことが出来ました。(処理時間:約2分)
ただ検索の代わりにフィルターを使用したところ
『項'xxx'をフィルター式で使うことは出来ません』とメッセージがでました。
これは参照フィールドだからでしょうか?

参照設定を行ったClieantDatasetを再度DataSetProvider→ClientDataSetと設定を行うと,
フィルターで条件を絞ることは出来ましたが2回もClientDataSetを経由させているせいか,
少々処理時間がかかりました(処理時間:約9分)

設定変更等をして早くならないか調べてみます。

(各コンポーネントの繋がり)
サーバー1 → Table1(データ) → DataSetProvider1 → ClientDataSet1(ClientDataSet2の値を参照設定)
                        → DataSetProvider3 → ClientDataSet3(フィルター処理) → DataSource1 → DBGrid1

サーバー2 → Table2(マスタデータ等) → DataSetProvider2 → ClientDataSet2

あとTQueryのヘルプ見落としていたんですが,
『異種間の問い合わせの作成』というのを見つけました。
試してみたんですが,
  設計時:QueryをActive=TrueにするとDelphiが終了する。
  実行時:QueryをOpenするとメモリエラー?が発生する。
という状態です。

この方法で繋げることできた人はいますでしょうか?
よろしくお願いします。


Ru  2007-12-01 01:40:19  No: 28713

異種間の問い合わせのエラーですが,
どうもDelphi/400が原因の可能性が出てきました。

Delphi/400が使用するドライバを使用せずに
データソースを使用してつなげた場合は,
異種間の問い合わせは出来ました。
スピードは早いとは言い切れませんが・・・

パフォーマンスが上がるように工夫してみて
最善の方法でしようと思います。
moruさんありがとうございました。

エラーの件はDelphi/400の開発元に問い合わせてみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加