###前提・実現したいこと
大量データを扱う場合においての正常な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
もしかしたら質問として、初歩的なことを伺ってることになるかもしれませんが、どうぞ宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー