質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.25%

  • VBA

    1180questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • PostgreSQL

    751questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • Access

    283questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

PostgreSQL,Accessでinsert selectがおかしい

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 100

motimoti

score 2

Accessで、レコード数が約120万件あるPostgreSQLのテーブルから
リンクテーブルを経由して別のaccess上のテーブルへ全件Insertする処理があります。

そのInsertが全件正常に行われる場合と、
中途半端に40万件程度Insertされる場合があり、困っています。

処理中のAccessのメモリを監視すると、
正常時:700MBまでメモリ使用量が上がる
異常時:400MBまで使用量が上がったところで一旦30MB前後まで落ち、
再び300MBまで使用量が上がる(エラーは発生しません)
正常時、異常時共にOS全体のメモリ使用量は50%程度です。

極力プログラムは修正しない形で対応したいと考えています。
原因または対策を知っていましたら教えてください。

該当のソースコード

DoCmd.RunSQL "INSERT INTO 格納先テーブル名 IN 格納先ファイルパス SELECT * FROM リンクテーブル名

動作環境

サーバ
PostgreSQL 9.5 
WindowsServer2012 R2
メモリ4GB

クライアント
Windows10
メモリ6GB
Access 2013(32ビット版)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2018/01/11 19:22 編集

    Access実行環境のOSは64ビットでしょうか? OSもAccessも32ビット同士ならトラブルは少なそうなのですが。ODBC経由で参照しているPostgreSQLドライバーのバージョンはわかりますか?

    キャンセル

  • motimoti

    2018/01/12 09:07

    OSは64ビットですが、Accessは32ビットとなります。ドライバーのバージョンは9.05.01.00です。

    キャンセル

回答 3

0

MDBのサイズは2Gまでですが、そのデータをinsertした後のサイズはどの程度ですか?
また、mdbは最適化しないとサイズは増える一方ですけど、対応済みでしょうか?

追記

よく見ると制御用のaccessからデータ用のMDBへinsertしているのですね。
毎回別なMDBを使用しているなら大丈夫だと思いますが、繰り返し使用しているなら最適化は必要です。

またその出力先のMDBは出力中に参照されるようなことはないでしょうか?
accessは共有に対しては非力で、よく破損しますので。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/12 09:12

    insertした後のサイズは約500MBなので、サイズの制約には引っかからないと考えています。
    プログラムでの最適化は行っていません。

    キャンセル

  • 2018/01/12 10:40

    回答ありがとうございます。

    >またその出力先のMDBは出力中に参照されるようなことはないでしょうか?
    無いとは言い切れませんが、今回の現象は絶対に参照されない状況下でも発生しています。
    出力先のMDBは毎回同じですが、最適化後も現象が出てしまいます。

    キャンセル

  • 2018/01/12 11:17

    mdbが破損しかかっている場合に、動作が安定しないことがよくあります。
    最適化しても修復しきれないケースがあるので、出力先のMDBの内容をすべて(テーブルは構造のみ)インポートした、新規のMDBを作成してみて下さい。

    キャンセル

  • 2018/01/12 13:05

    該当のテーブル構造のみの新規MDBを作成し実行してみましたが、現象は変わりませんでした。

    キャンセル

  • 2018/01/12 14:54

    では、リンクテーブルではなくパススルークエリーを作成し行ってみて下さい。
    パススルークエリーとリンクテーブルではMSACCESSの振る舞いが変わってくるので、改善されるかもしれません。

    キャンセル

  • 2018/01/12 15:40

    リンクテーブルの代わりにパススルークエリーを使ってみましたが、結果は同じでした。
    (メモリ消費量の動きも同じでした)

    キャンセル

  • 2018/01/12 16:44

    後は件数分割しないで行うこととしては、処理が変更になってしまいますが、テーブルに出力するのではなく、一旦CSVで出力して、MDBにインポートすることぐらいでしょうか。

    キャンセル

0

MS-Accessのデータベースには、そんな無茶なことは出来ないと
経験上でわかります。
少ないコーディングでちゃんと動いてほしいのであれば、
SQLServer他まっとうなRDBMSで組み直してほしいです。

どうしてもMS-Accessでないと行けないのだとしたら、
Recordsetオブジェクトとしてオープンして、
リンクテーブル側から1行読み込んだら他方に1行書き込む、
を繰り返すループ処理を作りつつ、
この先は勘に頼る部分なのですが適切に「DoEvents」を挟まないと
途中で処理が暴走するケースが有りました。
例えば100行処理するごとにとか、500行処理するごとにとかで、
細かくDoEventsを入れると処理時間が遅くなるので注意です。
DoEventsを入れて、
ファイル自己拡張などシステム側が何か処理できるタイミングを設けることが必要です。

それと試していないのですが、
排他ロック上でやったらまた変わるかもしれません。
処理中はほかからのアクセスを拒否するような。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/12 10:08

    回答ありがとうございます。
    おっしゃる通り、一括でinsertするのではなく一定の行数ごとにループでinsertしていけば
    解消できるかなとは考えています。

    なぜ「極力プログラムは修正しない形で対応したい」と書いたかというと、
    OracleからPostgreSQLにサーバーのデータベースを移行してから現象が出るようになったため、
    PostgreSQL側の設定に何かしら問題があるのでは、と思ったためです。

    キャンセル

  • 2018/01/12 10:16

    だとすると、psqlODBCドライバーの改訂履歴を調べてみるのが良さそうな気がします。
    https://odbc.postgresql.org/docs/release.html
    で見ると「psqlODBC 09.05.0100 Release」のあと同じ09.05系は「psqlODBC 09.05.0400 Release」まで進んでいるので、
    一旦入れ替えて試すってのをやってみてはいかがでしょうか。

    キャンセル

  • 2018/01/12 10:38

    念のため確認ですが、ODBCの設定は32bit版でやってますよね?
    %windir%\SysWOW64\odbcad32.exe

    キャンセル

  • 2018/01/12 10:42

    ODBCの設定は32bit版で行っています。
    ドライバーを最新にして試してみたいと思います。

    キャンセル

  • 2018/01/12 13:04

    最新のドライバーで試してみましたが、結果は変わりませんでした。

    キャンセル

0

安定してないというのは難しいですね…他のやり方では
・CurrentDb.Executeで同じSQLを実行する
(Docmd.RunSQLでもそうですがdbFailOnError使うといいかと)
・select into(テーブル作成クエリ)で実行してみる
くらいですかね。根本的な解決にはならないかもしれませんが一応。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/12 13:27

    回答ありがとうございます。
    ・CurrentDb.Executeで同じSQLを実行する
    ・select into(テーブル作成クエリ)で実行してみる
    いずれも試してみましたが、現象は変わりませんでした。

    キャンセル

  • 2018/01/12 14:30

    そうでしたか…お力になれずすみません。
    やはり「一度に全てをinsertする」というのが難しいのだと思います。
    多少プログラムの変更になりますが確かpostgreはlimitとoffsetが使えるので
    1000件ずつとかはある程度楽に実装できますよ。

    キャンセル

  • 2018/01/12 15:42

    プログラムを修正するしか解決方法が無くなった場合は、
    limitやoffsetを使用して実装したいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.25%

関連した質問

同じタグがついた質問を見る

  • VBA

    1180questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • PostgreSQL

    751questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • Access

    283questions

    Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。