[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 メーリングリストの案内