• ベストアンサー

DBIによるまとめて実行

現在、PerlのDBIを使用し、MySQLの処理をするバッチ プログラムを開発しております。 データが1万件ほどあるのですが、1万データに対して、 1日1回ステータス等の反映処理を行わなければいけま せん。 これを現在ではfetchrowを使用し1万データを回して 各種updateをかけているのですが、非常に時間がかかるため、 何かまとめてupdateがかけられる方法がないかと質問さ せていただきました。 よろしくお願いいたします。

  • MySQL
  • 回答数2
  • ありがとう数4

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

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

更新条件や更新内容など不明ですが、クライアントにfetchしなくても、 ひとつの更新SQL文に纏める事が出来れば、サーバプロセス-クライアント間の 転送のためのオーバヘッドが減る分だけ、速くなると思いますよ。 もし、更新条件がややこしくて、単一の更新SQLに纏める事ができない場合は、 ストアドプロシジャ化するなどが、次善策になるかと思います。

ajtchf
質問者

お礼

ありがとうございます。 ストアドプロシジャはこういうときに使うものなんですね。 上記にも書かせていただきましたが、色々調べている上で、 プレースホルダというものを使用すれば高速に処理できるの ではという結論にいたりそうです。

その他の回答 (1)

  • spieder
  • ベストアンサー率59% (13/22)
回答No.2

どのような更新作業を行う必要があるのかわかりませんが、UPDATE文にCASEで条件等を書けばわざわざfetchrowで回さなくても、SQLで今の状態を元に一括更新ができると思います。 SQL1つ投げるだけなら、DBサーバー側との通信は最小限にまで減らせますので、1万行取得した内容に対して1万回UPDATE文を実行する必要はなくなります。

参考URL:
http://codezine.jp/article/detail/405
ajtchf
質問者

お礼

ありがとうございます。 色々調べている上で、プレースホルダというものを 使用すれば高速に処理できるのではという結論にいた りそうです。

関連するQ&A

  • DBIを使用してデータを連想配列に「入れたい。

    MySQLとDBIを使って、テーブルから取り出したデータの、カラムの名前をキー、フィールド値をバリューとした連想配列を作りたいのですが、どうすればいいでしょうか?? fetchrow_arrayの使い方は分かっているのですが、fetchrow_arrayだと配列しか作れないみたいなので・・ハッシュにしたいのです。 分かる方いらっしゃいましたらご教授よろしくお願いします。

    • ベストアンサー
    • Perl
  • DBIがうんともすんとも言いません だれか助けてください

    症状: perlのプログラム内でDBIを使うと、その後の行がすべてスキップされてしまいます。エラーをだしてくれることもなく、何が原因なのかさっぱりわかりません。 「 #!/usr/bin/perl use DBI; print "Content-type: text/html", "\n\n"; print "this is test"; $d = 'DBI:mysql:test:Localhost';# データソース $u = 'root';# ユーザ名 $p = 'mypass';# パスワード # データベースへ接続 $dbh = DBI->connect($d, $u, $p) or print "Can't connect to MySQL"; print "<br />success!"; 」 「this is test」は表示されるのですが、「success!」が表示されないのです。もちろん「Can't connect to MySQL」も、その他のエラー表示も表示されません。 「 $dbh = DBI->connect($d, $u, $p) or print "Can't connect to MySQL"; 」 の行を消すと、「success!」も表示されます。 DBIを再インストールしたほうがよいのでしょうか? もともと、DBIをインストールするとき、いろいろてこずっていて、その時に何かおかしなことになってしまったのかもしれません。 それとも別の場所に問題があるのでしょうか。 ________________________________ 環境: Ubuntu8 Xampp ちなみにcpanで i DBIとやると、 「 CPAN: Storable loaded ok (v2.18) Going to read /root/.cpan/Metadata Database was generated on Fri, 20 Jun 2008 07:02:51 GMT Strange distribution name [DBI] Bundle Bundle::DBI (TIMB/DBI-1.605.tar.gz) Module = DBI (TIMB/DBI-1.605.tar.gz) 2 items found 」 とでます。 この問題のおかげでもう2日間作業がすすまないでいます。どなたか力をかしてください。おねがいします。

    • ベストアンサー
    • Perl
  • DBIについて教えてください

    お世話になります。 Perlと、DBIを使って、オラクルに接続したときに 実用的に使える(ストレス少なめで)レコード件数は何件ぐらいでしょうか? ☆データ件数100万件 ☆更新は毎日 ☆検索などのプログラム のEコマースのページを作ろうと思っています。 JAVAは使用したことがないので、できればCGIを使えたらと考えています。 よろしくお願いいたします。

    • 締切済み
    • CGI
  • DBIが入っているはずですが、、、

    【 windows7 64bit + MySQL5.5 + ActivePerl 5.16.3 】 コマンドプロンプトで直接、 c:\>ppm install DBI No missing packages to install というメッセージがでます、これは「もうインストールされてるよー」という意味だと思いますが、プログラムを実行しても、 Software error: DBD::MySQL initialisation failed: Can't locate object method "driver" via package "DBD::MySQL" at C:/usr/local/lib/DBI.pm line 808. Perhaps the capitalisation of DBD 'MySQL' isn't right. at C:/Apache2.2/htdocs/00001/shinki_data_sakusei.pl line 33. というエラーがでます。 ====================================== # 初期設定部分 use strict; use warnings; # エラーをブラウザに表示 use CGI::Carp qw(fatalsToBrowser); use utf8; binmode STDIN, ':encoding(UTF-8)'; binmode STDOUT, ':encoding(UTF-8)'; binmode STDERR, ':encoding(UTF-8)'; use Encode; use DBI; # プログラム開始 # ユーザ名とパスワード my $dbname = 'login_data'; my $dbhost = 'localhost'; my $user = 'root'; my $pass = 'root'; #データベースへ接続 my $db = DBI->connect( "DBI:MySQL:dbname = $dbname;host = $dbhost", $user, $pass ); if ( ! $db ){ print "エラー: $db->err $db->errstr\n"; } # 命令 my $sth = $db->prepare( "SELECT * FROM login" ); # 実行 $sth->execute; # 出力 while( my @row = $sth->fetchrow_array ){ print "@row\n"; } #データベースから切断 $db->disconnect; __END__

    • ベストアンサー
    • Perl
  • DBIとDBD-mysqlのインストールについて

    sea_clear_skyです。 質問させて頂きます。 環境 Win98SE ACTIVEPERL API522e.exe JPERL    jperl522 ACTIVEPERL API522e.exeと JPERL    jperl522をインストールし、 PPMでDBIとDBD‐MYSQLのパッケージをインストールしようとすると DBIでも、DBD‐MYSQLの場合でも、MSDOS上で、 mismatched tag at line 18, column 2, byte 640 at C:/Perl/site/lib/XML/Parser.pm line 168 と表示され、パッケージがインストールされません。 回線はフレッツADSLを使用しています。 すいませんが、解決方法をご教授願います。 よろしくお願いします。 もし、この現象が解決できない場合は他のPealを使用したいので、 WIN98SEの環境で入るPEALについて教えて欲しいです。 MYSQLに繋げて、いろいろしたいので、MYSQLにつながり、 PERLのCGIの作成できるものが希望です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • DBIを使ってのデータの取り出しについて

    自分で作ったmysqlからデータを参照し様として #!/usr/bin/perl print "Content-type: text/html \n\n"; use DBI; #######DBIパス編集########## $DB='****' $DBusr='****' $DBpass='****' $DBtable='****' #########DBI操作############ $FIND = "SELECT a,b,c,d,e,f,g,h,i FROM $DBtable WHERE a=\'****\' limit 1"; $dbh = DBI->connect($DB,$DBusr,$DBpass); $serch = $dbh->prepare($FIND); $serch->execute; $serch = $serch->fetch; #######取り出したデータを配列に代入######## $r = 0; while( @rows = $serch->fetchrow_array ) { for( $f = 0; $f < $serch->{NUM_OF_FIELDS}; $f++ ) { $data{$serch->{NAME_lc}->[$f]}{$r} = $rows[$f]; } $r++; } while( ($key, $val) = each %data ) { while( ($key2, $val2) = each %{$val} ) { $hash{$key} = $val2; } } $a = $hash{'a'}; $b = $hash{'b'}; $c = $hash{'c'}; $d = $hash{'d'}; $e = $hash{'e'}; $f = $hash{'f'}; $g = $hash{'g'}; $h = $hash{'h'}; ##########テスト用に表示############# print "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;CHARSET=Shift_JIS\">"; print "<HTML><HEAD>"; print "<TITLE></TITLE>"; print "</HEAD>"; print "<BODY BGCOLOR=$bgc TEXT=\"$txtc\" LINK=\"$lic\">"; print "テスト:$bgc,$txtc,$lic,$button,$sight_name,$sight_tit,$bun1,$sex"; print "</BODY></HTML>"; と書いてるのですが、実行するとデータが取り出せません。 調べてみると while( @rows = $serch->fetchrow_array ) の部分でエラーが出ます。 Can't call method "fetchrow_array" on unblessed reference atと言われてしまうのですが、何か記述の仕方等何か間違ってる部分などあれば指摘お願い致します。 ちなみにデータベースへの接続等は出来ています。

    • ベストアンサー
    • Perl
  • MySQLのDBIでは、サイズで制限があるのでしょうか?

    MySQLで LONGTEXT型 指定できるMAXサイズ 4.2Gバイトまで格納できますが DBI (DBD-mysql)でインサートさせる場合、プレースホルダーでデータの追加を行おうとすると、 DBD::mysql::st execute failed: MySQL server has gone away at スクリプト名 line 142, <GEN0> line ???? と表示されます。 サイズを試行錯誤でどこまでいけるか確めたところ、 982937バイトまでは登録できますが982938でエラーになります。 MySQLのLONGTEXT型は4.2Gバイトなのに、100万バイト(約1Mバイト)でエラーになるのは、がっかりです。 皆さんは、1Gクラスのデータを挿入する(機会は少ないと思いますが) どのようにされているのでしょうか? 私の環境だけが悪いのでしょうか? Perl5.6.1(Win) MySQL4.0.20

    • ベストアンサー
    • MySQL
  • perlのDBIよりMysqlにアクセスすると

    perlのDBIよりMysqlにアクセスすると DBD::mysql::db do failed: Data too long for column...のエラーが発生します。 つまり長すぎるデータを格納しようとしてエラーが出ているようです。 格納するデータの文字コードはutf-8です。 カラムは試しにvarchar(255)にしていますので、おそらく文字コードが原因ではないかと推測しています。 phpMyAdminから SHOW VARIABLES;コマンドを実行したところ 文字コード関係は以下の設定です。 character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem binary character_set_results utf8 character_set_server sjis character_set_system utf8 character_sets_dir C:\Program Files\MySQL\MySQL Server 5.0\share\char... collation_connection utf8_general_ci collation_database utf8_general_ci collation_server sjis_japanese_ci 開発環境は MySQL - 5.0.24-community-nt phpMyAdmin - 2.8.2.2 MySQL クライアントバージョン: 4.1.7 OS;WIN_XP Active Perl 5.8.8 です。 お気付きの点がございましたらご指摘宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • MYSQLテーブルの「見出し」を読み出す関数

    DBIでMySQLを使っているのですが、 fetchrow_arrayでは、各データーにアクセスできますが、テーブルの「見出し」を読み出す関数はないのでしょうか? PHPには、見出しを読み出せる関数があるみたいのですが、やっぱり、PHPのほうが有利なのかな?

    • ベストアンサー
    • Perl
  • MySQLとの接続でfetchrow_arrayがwhile文で使えない

    こんばんは、皆さん。 MySQLをPerlから使いたいのですが、 以下のようにやっても、$flagに"OK"が入りませんでした。 つまり、whileは一度もループしないで抜けてしまっているようです。 ------------------------------------------------- use DBI; … sub dbtest{ $dbh = DBI->connect("dbi:mysql:hogeDB:localhost","user","pass"); $sql = "select hoge,fuge from t_name where key='value'"; $sth = $dbh->prepare($sql); $sth->execute; while( ($hoge, $fuge) = $sth->fetchrow_array ){     $flag = "OK"; } $sth->finish; $dbh->disconnect; } ------------------------------------------------- ※実際はユーザ名などは変数にしています。 バージョンは現在、 Perl:v5.8.5 MySQL:5.1.6-alpha となっているようです。 それとちょっと別件ですが、 use autouseの書式は以下でよいのでしょうか? 「use autouse DBI;」 しかし、これだけだとDBIが読み込めてないエラーになるようです。 ご教示よろしくお願いします。

    • ベストアンサー
    • Perl