• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MSAceess テーブル結合でメモリエラー)

MSAceess テーブル結合でメモリエラー

このQ&Aのポイント
  • Windows XP, MS Access 2007でテーブル結合を行う際にメモリエラーが発生しています。
  • 結合するテーブル数が多すぎるため、レポートの表示が遅くなり、最後のページを開くとメモリ不足のエラーが出力されます。
  • OSの限界4GBに対して結合するテーブル数が大きすぎるため、効率的な方法を模索しています。

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

  • ベストアンサー
回答No.2

>結合するテーブル数が多すぎるのが問題なのだと思いますが、 >どのような方法がよいのでしょうか。 テーブル結合を、INNER JOINかLEFT JOINにする。 現状では「全部のテーブルが無条件結合」されるので、内部的に「総当りですべての組み合わせ」が内部的に作られてから、WHEREに一致しないレコードが除外されるので、たぶん、4GBのメモリがあっても足りないだろうと思われます。 「総当りですべての組み合わせを作った場合のレコード数」は「すべてのテーブルのレコード数を掛け算した数」です。 例えば、700レコードある基本のTBLに、50レコードあるテーブルを無条件に結合すると、内部的に700×50=35000レコードのデータが生成されます。 もし、主テーブルが700レコード、各サブテーブルが100レコードあれば、主のTBLにTBL1~TBL10を無条件結合すると、700×100×100×100×100×100×100×100×100×100×100=70000000000000000000000レコード生成されます。 1レコードに200バイト使用すると仮定すると、14000000000000000000000000バイト必要です。 自分が、どんだけ無謀な事をしようとしているか、理解した方が良いです。

palayo
質問者

お礼

LEFT JOINで結合条件を指定したところ、一瞬で終わりました。 ありがとうございました。

その他の回答 (5)

回答No.6

追記。 ANo.4のクエリを 主TBL:700レコード 副TBL1~10:100レコード の11個のテーブルで結合してみたが、まったく問題なく動作した。 動作環境は、あえて WinXP Pro SP3 Access97 メモリ768MB CPU Celeron CPU 2.5GHz というチープな環境にしてみたが、まったく問題が無かった。

回答No.5

内部結合を使えばどうでしょうか。 SELECT TBL.ID, TBL.NAME, TBL_1.NAME, TBL_2.NAME, TBL_3.NAME, TBL_4.NAME, TBL_5.NAME, TBL_6.NAME, TBL_7.NAME, TBL_8.NAME, TBL_9.NAME, TBL_10.NAME FROM (((((((((TBL INNER JOIN TBL AS TBL_1 ON TBL.REF_ID1 = TBL_1.ID) INNER JOIN TBL AS TBL_2 ON TBL.REF_ID2 = TBL_2.ID) INNER JOIN TBL AS TBL_3 ON TBL.REF_ID3 = TBL_3.ID) INNER JOIN TBL AS TBL_4 ON TBL.REF_ID4 = TBL_4.ID) INNER JOIN TBL AS TBL_5 ON TBL.REF_ID5 = TBL_5.ID) INNER JOIN TBL AS TBL_6 ON TBL.REF_ID6 = TBL_6.ID) INNER JOIN TBL AS TBL_7 ON TBL.REF_ID7 = TBL_7.ID) INNER JOIN TBL AS TBL_8 ON TBL.REF_ID8 = TBL_8.ID) INNER JOIN TBL AS TBL_9 ON TBL.REF_ID9 = TBL_9.ID) INNER JOIN TBL AS TBL_10 ON TBL.REF_ID10 = TBL_10.ID; 試してないので、改善できるかどうかは不明です。 これで改善できないようなら、クエリを使わずに、レポートのレコードソースは TBL にして、 名前のテキストボックスをコンボボックスにして表示させるようにしたらどうでしょうか。 コンボボックスの設定は、 コントロールソース REF_ID1 値集合ソース TBL 連結列 1 列数 2 列幅 0cm 以下、コントロールソースのみ変更して、他のそのままの設定のコンボボックスを REF_ID10 まで作成します。

回答No.4

具体的には、以下のようなクエリになるであろう。 SELECT TBL.ID, TBL.NAME, TBL1.NAME AS REF_NAME1, TBL2.NAME AS REF_NAME2, TBL3.NAME AS REF_NAME3, TBL4.NAME AS REF_NAME4, TBL5.NAME AS REF_NAME5, TBL6.NAME AS REF_NAME6, TBL7.NAME AS REF_NAME7, TBL8.NAME AS REF_NAME8, TBL9.NAME AS REF_NAME9, TBL10.NAME AS REF_NAME10 FROM (((((((((TBL INNER JOIN TBL1 ON TBL.REF_ID1 = TBL1.ID) INNER JOIN TBL2 ON TBL.REF_ID2 = TBL2.ID) INNER JOIN TBL3 ON TBL.REF_ID3 = TBL3.ID) INNER JOIN TBL4 ON TBL.REF_ID4 = TBL4.ID) INNER JOIN TBL5 ON TBL.REF_ID5 = TBL5.ID) INNER JOIN TBL6 ON TBL.REF_ID6 = TBL6.ID) INNER JOIN TBL7 ON TBL.REF_ID7 = TBL7.ID) INNER JOIN TBL8 ON TBL.REF_ID8 = TBL8.ID) INNER JOIN TBL9 ON TBL.REF_ID9 = TBL9.ID) INNER JOIN TBL10 ON TBL.REF_ID10 = TBL10.ID;

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.3

>>それはそうだと思うので、どうすれば可能なのかを教えてください。 一般的には、いくつかの中間テーブルにいくつかのテーブルの結合結果を収容する処理を行います。 そうして、中間テーブルどうしを結合する処理にすれば、最終結果を得るときの結合テーブル数を減らすことが可能となります。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>結合するテーブル数が多すぎるのが問題なのだと思いますが、 どのような方法がよいのでしょうか。 結合するテーブル数を少なくするように工夫するのがいいと思います。

palayo
質問者

お礼

それはそうだと思うので、どうすれば可能なのかを教えてください。

関連するQ&A