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

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

新規登録して質問してみよう
ただいま回答率
85.49%
PostgreSQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

4626閲覧

大量データ 挿入 削除 の繰り返しについて

riddle

総合スコア12

PostgreSQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/02/11 04:01

編集2017/02/11 14:36

###前提・実現したいこと
大量データを扱う場合においての正常なDB動作を実現したいと考えております。

###発生している問題・エラーメッセージ

2万件のPDFデータを今回はOIDにしてDBに取り込みたく考えていますが、下記のルーチンで困ったことがおきています。

1.PDFをOID化してDBに取り込む
2.取り込み終了

//20170211 20:35 更新
3.drop table test --コマンドよりテーブルを削除

//20170211 20:35 更新
4.create table test --テーブルとカラム等を生成

運用前に色々テストしたく、取り込みが完了したら一度テーブルを削除して、作成しなおして、再度取り込み、を繰り返しております。

ここで、何度か実行しているうちに、PDF(2万件)とデータ挿入後のデータ数が一致しなくなってきました。

この事象が発生したあとに、tableを作成しなおし、カウントをとったところ、0件でしたが、再度2万件のデータを取り込むと、29000件程度の挿入結果となり、データ数が一致しませんでした。

###該当のソースコード

テーブル test
カラム id(int 自動連番)、name(text)、pdfobj(oid)
id・・・自動連番
name・・・ファイル名
pdfobj・・・取り込んだPDFのデータ

上記テーブル構造で

insert文でpdfをDBに格納し、
全てのデータが挿入しおわったら、drop table test で
testテーブルを削除しておりました。

//20170211 23:15 更新

/*事前に$dbhにてコネクトしております*/ $dir = "/tmp/"; if( is_dir( $dir ) && $handle = opendir( $dir ) ) { /*指定フォルダの中にあるファイル毎にループしています*/ while( ($file = readdir($handle)) !== false ) { /*ファイルであればif内に入ります*/ if( filetype( $path = $dir . $file ) == "file" ) { //ファイル名の取得 → $filenameに格納 //取得したファイルのoid化したもの → $oidに格納 $dbh->beginTransaction(); $dbh->exec("insert into test(name, pdfobj) values ('$filename', '$oid')"); if($dbh){//成功 $dbh->commit(); }else{//失敗 $dbh->rollBack(); } } } }

###補足1
drop table では完全にデータが削除されずゴミが裏で残っていたりするのでしょうか?
普通はdelete文でレコードを削除するものなのでしょうか。

大量データとOIDを今まで扱ったことがなく、どうしてこのような現象が起きているのか検討がつきません。

//20170211 20:35 更新
oidはpg_lo系の関数で作成しDBに格納してあります。

###補足2
言語:php 5.4
DB:postgres 9.4

もしかしたら質問として、初歩的なことを伺ってることになるかもしれませんが、どうぞ宜しくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2017/02/11 11:01

実施した手順を正確に、省略せず示して下さい。dropdbはテーブルではなくデータベースを削除するコマンドですし、ALTER TABLE文ではテーブルを作成できません。
riddle

2017/02/11 11:37

失礼致しました。出かける前に質問しておきたく少々急いでおりましたので、色々と詳細が不明な箇所が多くて申し訳御座いません。
ikedas

2017/02/11 12:21

いえいえ。あと、実行中にサーバログには何か出力されていませんか。あれば示していただけませんか。
ikedas

2017/02/11 12:34

また、実行しているプログラムのソースコードも示していただいたほうがいいと思います。
riddle

2017/02/11 14:32

ご丁寧にありがとうございます。ログとソースコードが社内の為情報の持ち出しができない状態です。ログは会社で確認しなければなりませんが、ソースコードを可能な範囲で思い出し書き出しました。
guest

回答1

0

ベストアンサー

$dir = "/tmp/";

ファイル数が29000個有るのではないでしょうか?
もしLinuxで/tmpをお使いであれば、他のファイルも混合し存在する可能性が有ります。
O/S系の処理でもつかいますので。

投稿2017/02/12 23:00

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

riddle

2017/02/13 10:49

解決しました。 原因はラージオブジェクトは単にテーブルをdropするだけでは表面上でしか消えず、裏でラージオブジェクトの領域が残るようです。 ですので、vacuumlo等でバキューム処理したり、lo_unlink等で削除したりする必要があるみたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問