[Seasar-user:20929] Re: 回复: Re:outsideSqlで複数インサート文を一括で実行したい

kubo [E-MAIL ADDRESS DELETED]
2011年 7月 29日 (金) 13:04:46 JST


久保(jflute)です。

iafandaさんへ

> 新しいテーブルは以下のように作りますautotable1、autotable2......autotableN。
> システムで自動生成の構造は固定です。

カラム構成(テーブル構造)は同じで、テーブルの名前だけが
規則的で、かつ、動的に変わるのであれば、
DBFluteの自動生成時点でダミーテーブルを作成しておいて、
DBFluteConfigのTableSqlNameFilterで動的にテーブル名が
変わるような仕組みにして、Behavior.batchInsert() を使っては
どうでしょうか?

// DBFluteConfig - TableSqlNameFilter | DBFlute
http://dbflute.sandbox.seasar.org/ja/manual/function/ormapper/runtime/allcommon/dbfluteconfig.html#tablesqlnamefilter

TableSqlNameFilter には、スレッドローカルなどを利用して、
登録処理を実行するプログラムから、autotable1 なのか、
autotable2 なのか、3 なのか、4 なのかを渡せるようにすれば、
動的にテーブル名を変更できます。

※そうすれば、そもそも外だしSQLを使う必要はありません。

> 「JDBCのバッチ更新で、複数の更新SQL(DML)を一度にデータベースに送って処理させる機能で、
>  1個ずつSQLを発行するよりも処理が速いという利点があります。」
> そこで速度向上のための機能がないですか?

外だしSQLでは、バッチ更新の機能はありません。
ただ、MySQLであればFORコメントを利用した
複数Insertが利用できるかもしれません。

insert into (...)
 values ([値, 値, ...])
          , ([値, 値, ...])
          , ([値, 値, ...])
          , ([値, 値, ...])

// パラメータコメント - FORコメント | DBFlute
http://dbflute.sandbox.seasar.org/ja/manual/function/ormapper/outsidesql/pmcomment.html#forcomment

どれだけパフォーマンスが向上するかどうかは不明ですが、
都度都度実行するよりかは速くなると思います。

2011/7/29  <[E-MAIL ADDRESS DELETED]>:
> 久保さんへ
> iafandaです
> いつもお世話になっております。
> 質問の説明は悪くてすいません。
>> 「テーブルはシステムで自動生成」
>> つまり、システムの稼働中に create table を実行して
>> テーブルが作成される、という意味ですね?
> そうです。
>> 「事前にテーブル操作用クラスが用意できないです。」
>> つまり、DBFluteの自動生成時にはテーブルはまだ存在しないので、
>> Behavior や Entity をDBFluteで自動生成できない、という意味ですね?
> そうです。
>> ということで、Behavior の batchInsert() が利用できないので、
>> 外だしSQL(outsideSql) でそれと同じような速度向上のための
>> 機能がないかどうか?ということですね。
> そうです。
>> システムで自動生成の構造は固定的なのでしょうか?
>> もしそうであれば、DBFluteの自動生成時にダミーで
>> そのテーブルを用意しておいて、システムでテーブルが
>> 作成されてから、Behavior で batchInsert() するというのも
>> できるかもしれません。
> おっしゃるとおり、現在はダミーテーブル(autotable)を用意して、
> 新しいテーブルは以下のように作りますautotable1、autotable2......autotableN。
> システムで自動生成の構造は固定です。
> 外だしSQL(outsideSql):
>  CREATE TABLE IF NOT EXISTS /*$pmb.tablename*/autotable
>  (
>    `id` varchar(10) NOT NULL,
>    `name` varchar(10) NOT NULL,
>  ) ENGINE=InnoDB DEFAULT CHARSET=utf8
> /*$pmb.tablename*/に設定する値はautotable1またはautotable2......
> ここまでは問題ないです。
>
> csvデータ投入時以下の外だしSQL(outsideSql)となります、データ量は10万から100万までです。
>  INSERT
> INTO  /*$pmb.tablename*/autotable  (id,name)  VALUES(/*$pmb.id*/1234567890 ,/*$pmb.name*/'1234567890')
> 「JDBCのバッチ更新で、複数の更新SQL(DML)を一度にデータベースに送って処理させる機能で、
>  1個ずつSQLを発行するよりも処理が速いという利点があります。」
> そこで速度向上のための機能がないですか?
> 教えてください。
> < 処理速度を上げたいのであれば、outsideSql で insert 文 (一レコード分) を書いて、
> < 「batchInsertみたいな」ことを実行しても、あまり速度は変わらないと思います。
> < (もともと batchInsert 自体がDBFluteの中では速度重視の機能です)
> outsideSql で insert 文 (一レコード分) を書いて、毎回sql文内容が変わるから、あまり速度は変わらないということですか?
> よろしくお願いします。
>> 久保(jflute)です。
>>
>> >> テーブルはシステムで自動生成(create table)したので、事前にテーブル操作用クラスが用意できないです。
>>
>> iafandaさんの言っていることが理解できたかもしれません。
>>
>> 「テーブルはシステムで自動生成」
>> つまり、システムの稼働中に create table を実行して
>> テーブルが作成される、という意味ですね?
>>
>> 「事前にテーブル操作用クラスが用意できないです。」
>> つまり、DBFluteの自動生成時にはテーブルはまだ存在しないので、
>> Behavior や Entity をDBFluteで自動生成できない、という意味ですね?
>>
>> ということで、Behavior の batchInsert() が利用できないので、
>> 外だしSQL(outsideSql) でそれと同じような速度向上のための
>> 機能がないかどうか?ということですね。
>>
>> すいません、先ほどのメールの時点では、
>> これがよく理解できていませんでした。
>>
>> システムで自動生成の構造は固定的なのでしょうか?
>> もしそうであれば、DBFluteの自動生成時にダミーで
>> そのテーブルを用意しておいて、システムでテーブルが
>> 作成されてから、Behavior で batchInsert() するというのも
>> できるかもしれません。
>>
>> もし、システムで自動生成の構造が変動的なのであれば、
>> どのみち外だしSQL(outsideSql)でもinsert文を書くのは
>> 難しいような気がします。
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>


Seasar-user メーリングリストの案内