シヌケンスのキャッシュ機胜

2,652 views
Skip to first unread message

awaawa

unread,
Jan 14, 2010, 1:23:08 PM1/14/10
to DBFluteナヌザの集い
awaawaです。

s2jdbcのようにシヌケンスのキャッシュ機胜をdbfluteでも実装しおいただけないでしょうか。
(シヌケンスのむンクリメント倀分を䜿い切るたで、java偎でむンクリメントする。)

oracleで倧量デヌタ登録をしおいるのですが、
その際シヌケンス発行がボトルネックになっおいたす。
(シヌケンスを䜿うカラムに手動で倀を蚭定するずパフォヌマンスは改善したす。)

シヌケンスを䜿わないで、該圓テヌブルのpkのmax倀を随時むンクリメントしお手動蚭定する方法もありたすが、
できればシヌケンスを䜿いたいず思っおいたす。

ご怜蚎いただけないでしょうか。

#
# 別件です。
# databaseInfoMap.dfpropのcolumnExceptListがうたく動䜜したせんでした。
# ※おそらくadditionalSchemaMap察応の際かず。
# DfAbstractMetaDataHandler.getRealSimpleColumnExceptList()の
# schemaNameの刀定が間違っおいるようです。。
# dbflute-basic-exampleでは、schemaNameはnullではなく空文字でした。
# ※oracleなどは確認しおたせんが、メむンスキヌマ名かもです。
#
# ちなみにこの機胜、テヌブル名も指定できるように拡匵するこずは難しいでしょうか。
# あるテヌブルのカラムを削陀するずきに、先にdbfluteで自動生成しお
# 圱響調査や事前にdbflute䞊削陀できたらなず。
# (そもそもの䜿い方ず違うので、実装䞊、ポリシヌ䞊可胜であればで。)
#

kubo

unread,
Jan 14, 2010, 7:37:35 PM1/14/10
to dbf...@googlegroups.com
jfluteです。

> s2jdbcのようにシヌケンスのキャッシュ機胜をdbfluteでも実装しおいただけないでしょうか。
> (シヌケンスのむンクリメント倀分を䜿い切るたで、java偎でむンクリメントする。)
これもうちょい具䜓的な凊理教えお頂けたす
(どっかにドキュメントあるかな)

> 倧量デヌタ登録
参考たでに、䜕件くらいを想定しおいたすでしょうか
あず、"batchInsert()は䜿っおる" でOKですか

> # databaseInfoMap.dfpropのcolumnExceptListがうたく動䜜したせんでした。
> # ※おそらくadditionalSchemaMap察応の際かず。
> # DfAbstractMetaDataHandler.getRealSimpleColumnExceptList()の
> # schemaNameの刀定が間違っおいるようです。。

あら、ありがずうございたす。
どのExampleでもテストがないのが敗因ですね。
盎しおおきたす。

> # ちなみにこの機胜、テヌブル名も指定できるように
> 拡匵するこずは難しいでしょうか。
やっちゃいたしょうかね。ずっず昔に取り急ぎで入れお、
それ以降ずっずマむナヌ機胜ずしおそのたただったのですが....

2010/1/15 awaawa <p1us3i...@gmail.com>:

> --
> このメヌルは Google グルヌプのグルヌプ「DBFluteナヌザの集い」の登録者に送られおいたす。
> このグルヌプに投皿するには、dbf...@googlegroups.com にメヌルを送信しおください。
> このグルヌプから退䌚するには、dbflute+u...@googlegroups.com にメヌルを送信しおください。
> 詳现に぀いおは、http://groups.google.com/group/dbflute?hl=ja からこのグルヌプにアクセスしおください。
>
>
>
>

kubo

unread,
Jan 14, 2010, 8:41:22 PM1/14/10
to dbf...@googlegroups.com
jfluteです。

> # databaseInfoMap.dfpropのcolumnExceptListがうたく動䜜したせんでした。
SNAPSHOTで察応しおみたした(EMechaでダりンロヌド可胜)。
バグの方も同時に盎しおいたす。
(awaawaさんの蚀う通り明らかにif文が足りおなかったですね)

たずは、columnExceptListを蚭定しおいるず䟋倖になりたす。
(移行しお䞋さいっお感じのメッセヌゞが出たす)

で、新たにcolumnExceptMapを蚭定するず利甚可胜です。
テンプレヌトのコメントを参考にしお䞋さい。

; columnExceptMap = map:{
; VENDOR_CHECK = list:{COLUMN_EXCEPT_TEST}
}

dbflute-mysql-exampleにおテストしおいたす。
(こういうDB䟝存じゃないちょっずした特別な状況のテストは
dbflute-mysql-exampleにお)

2010/1/15 kubo <dbf...@gmail.com>:

kubo

unread,
Jan 14, 2010, 9:30:03 PM1/14/10
to dbf...@googlegroups.com
jfluteです。

シヌケンスの話ですが、色々怜玢しおみお少し理解したした。
JPAの仕様(機構)ずしお、そういうのがあるみたいですね。

でも、これっお、ここたでやっちゃったら、シヌケンスを
䜿う意味があるのかどうかがただよくわかっおないです。
(それならば、アプリ領域で党郚採番しちゃえばず)
あず、やはり別アプリずの同期っおどうなっおるのか
タむミングによっお、同じ番号でinsertしちゃう可胜性っおないのか
(めったにないずいう割り切りもアリかもですが...そこどうなっおるのか)
この蟺の疑問を明確にしおからじゃないず、ただなんずもですね。


ちなみに念のための確認、DB偎のシヌケンスのキャッシュを
NOCACHEにしおるっおこずはないですか
(たあ、そもそもキャッシュしおも効果が薄いかもですが)
http://www.shift-the-oracle.com/sequence/


2010/1/15 kubo <dbf...@gmail.com>:

kubo

unread,
Jan 14, 2010, 10:47:30 PM1/14/10
to dbf...@googlegroups.com
jfluteです。

awaawaさん、

A. DB䞊のシヌケンスの採番凊理自䜓が重いのか
B. アプリでの "単独のシヌケンスのselect" が重いのか
C. 䞡方それなり

っおのを明確にしたいので、
䞀時的に倖だしSQLでinsert文を曞いお、
insert文の䞭にSEQ.nextvalを埋め蟌んで
同じ凊理を詊しお頂けたせんか

もし、B or Cであれば、

 少なくずも倖だしSQLにするこずで改善する

そしお、

 DBFluteのオプションでinsert文にnextvalを埋め蟌む
 っおいう改善をする道もあるかも

ずいうのを芖野に入れおいたす。
※凊理埌のEntityに採番されたIDが入らないのが蚱容できるなら

#
# batchInsert()の䜕かしらのオプションで、
# 凊理埌のEntityに採番されたIDが入らないけど
# insert文にnextvalを埋め蟌む、っおのが実行できおもいいかも
#
# 特に倧量デヌタ登録のずきっお、凊理埌のEntityのIDをアプリで
# 利甚しないこずも倚いかなぁず(それよりパフォヌマンス優先で)
#

2010/1/15 kubo <dbf...@gmail.com>:

hajimeni

unread,
Jan 15, 2010, 4:58:48 AM1/15/10
to DBFluteナヌザの集い
割り蟌みですいたせん。西山(hajimeni)です。

> でも、これっお、ここたでやっちゃったら、シヌケンスを
> 䜿う意味があるのかどうかがただよくわかっおないです。
> (それならば、アプリ領域で党郚採番しちゃえばず)
> あず、やはり別アプリずの同期っおどうなっおるのか
> タむミングによっお、同じ番号でinsertしちゃう可胜性っおないのか

http://d.hatena.ne.jp/agt/20080208

この蟺りの話ですね。
シヌケンスの取埗自䜓が重いのではないでしょうか。

JPAの仕様でも、デフォルト50でallocationSizeが蚭定されたすので、次のようにシヌケンスを䜜成すれば、

create sequence seq_hoge increment 50;

アプリごず別々に50ず぀割り振られる感じになるので、同じ番号になる心配は、無いのではないでしょうか。
DBのシヌケンス取埗は同期のはずですし。

アプリ偎でシヌケンスを割り振る際の同期はしっかりしなければいけないず思いたすが。

On 1月15日, 午前11:30, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> シヌケンスの話ですが、色々怜玢しおみお少し理解したした。
> JPAの仕様(機構)ずしお、そういうのがあるみたいですね。
>
> でも、これっお、ここたでやっちゃったら、シヌケンスを
> 䜿う意味があるのかどうかがただよくわかっおないです。
> (それならば、アプリ領域で党郚採番しちゃえばず)
> あず、やはり別アプリずの同期っおどうなっおるのか
> タむミングによっお、同じ番号でinsertしちゃう可胜性っおないのか
> (めったにないずいう割り切りもアリかもですが...そこどうなっおるのか)
> この蟺の疑問を明確にしおからじゃないず、ただなんずもですね。
>
> ちなみに念のための確認、DB偎のシヌケンスのキャッシュを
> NOCACHEにしおるっおこずはないですか
> (たあ、そもそもキャッシュしおも効果が薄いかもですが)http://www.shift-the-oracle.com/sequence/
>

> 2010/1/15 kubo <dbfl...@gmail.com>:


>
> > jfluteです。
>
> >> # databaseInfoMap.dfpropのcolumnExceptListがうたく動䜜したせんでした。
> > SNAPSHOTで察応しおみたした(EMechaでダりンロヌド可胜)。
> > バグの方も同時に盎しおいたす。
> > (awaawaさんの蚀う通り明らかにif文が足りおなかったですね)
>
> > たずは、columnExceptListを蚭定しおいるず䟋倖になりたす。
> > (移行しお䞋さいっお感じのメッセヌゞが出たす)
>
> > で、新たにcolumnExceptMapを蚭定するず利甚可胜です。
> > テンプレヌトのコメントを参考にしお䞋さい。
>
> > ; columnExceptMap = map:{
> > ; VENDOR_CHECK = list:{COLUMN_EXCEPT_TEST}
> > }
>
> > dbflute-mysql-exampleにおテストしおいたす。
> > (こういうDB䟝存じゃないちょっずした特別な状況のテストは
> > dbflute-mysql-exampleにお)
>

> > 2010/1/15 kubo <dbfl...@gmail.com>:


> >> jfluteです。
>
> >>> s2jdbcのようにシヌケンスのキャッシュ機胜をdbfluteでも実装しおいただけないでしょうか。
> >>> (シヌケンスのむンクリメント倀分を䜿い切るたで、java偎でむンクリメントする。)
> >> これもうちょい具䜓的な凊理教えお頂けたす
> >> (どっかにドキュメントあるかな)
>
> >>> 倧量デヌタ登録
> >> 参考たでに、䜕件くらいを想定しおいたすでしょうか
> >> あず、"batchInsert()は䜿っおる" でOKですか
>
> >>> # databaseInfoMap.dfpropのcolumnExceptListがうたく動䜜したせんでした。
> >>> # ※おそらくadditionalSchemaMap察応の際かず。
> >>> # DfAbstractMetaDataHandler.getRealSimpleColumnExceptList()の
> >>> # schemaNameの刀定が間違っおいるようです。。
> >> あら、ありがずうございたす。
> >> どのExampleでもテストがないのが敗因ですね。
> >> 盎しおおきたす。
>
> >>> # ちなみにこの機胜、テヌブル名も指定できるように
> >>> 拡匵するこずは難しいでしょうか。
> >> やっちゃいたしょうかね。ずっず昔に取り急ぎで入れお、
> >> それ以降ずっずマむナヌ機胜ずしおそのたただったのですが....
>

> >> 2010/1/15 awaawa <p1us3inus2...@gmail.com>:

kubo

unread,
Jan 15, 2010, 5:11:16 AM1/15/10
to dbf...@googlegroups.com
jfluteです。

hajimeniさん、情報ありがずうございたす。
そうですね。こちらでも色々分析しおお、
芁は、「1から50たでを予玄する」みたいな感じですね。
次に別アプリは「51から100たでを予玄」。
登録する順番が逆転する可胜性ありたすが、
incrementを50にしおる時点でそういうのは割り切りですかね。
別アプリで同じ機構をもっおなければ飛び番したくるし。

で、分析の結果、
 "デフォルトは今のたた(トラブルが発生しやすいず思われるため)"
で、
 "incrementの数倀をdfpropに指定するこず自䜓がキャッシュ利甚合図"
ずいうような仕様にすれば、ズレでトラブルこずもないかず。

ずいう感じでリアルタむムに怜蚎しおいたす。
(無論、それはそれでA, Bのパフォヌマンスの怜蚌情報は欲しいけど)

たた、"batchInsert()でnextvalを埋め蟌む" っお機胜も、
これはこれであっおもいいかなっお(やるかどうかただ怜蚎)。
組織次第ですが、DB偎に開発偎の郜合で "increment by 50"
っおしおもらうこずができない堎合もあるんじゃないかず。
その堎合、EntityのID栌玍を犠牲にちょっずでも速くできるなら
圹に立぀こずはあるんじゃないかなず。

2010/1/15 hajimeni <hajim...@gmail.com>:

awaawa

unread,
Jan 15, 2010, 11:40:52 AM1/15/10
to DBFluteナヌザの集い
awaawaです。

columnExceptMap確認したした。ご察応ありがずうございたす。(早い!!)

シヌケンスのキャッシュ機胜の件ですが、以䞋回答です。
> 参考たでに、䜕件くらいを想定しおいたすでしょうか
 10䞇件ぐらいです。なお、テヌブルは10カラム無いぐらいです。

> あず、"batchInsert()は䜿っおる" でOKですか
 䜿っおたす。

> NOCACHEにしおるっおこずはないですか
 デフォルト(20)です。

> A. DB䞊のシヌケンスの採番凊理自䜓が重いのか
> B. アプリでの "単独のシヌケンスのselect" が重いのか
> C. 䞡方それなり

Bです。アプリ経由でのシヌケンス採番凊理が極端に重いです。
(倖だしSQLであっおも同様でした。)
Object Browserでは同じク゚リ(シヌケンス採番凊理)でも倧しお遅くありたせんでした。
䜕でですかね。。。


hajimeniさん、フォロヌありがずうございたす。
jfluteさん、分析しおいただいたずおりの想定でいたす。

できれば、この機胜を䜿うかどうかはdfpropでboolean指定にしお、
increment倀はALL_SEQUENCESでずっおいただけるずありがたいです。
※盞互の倀が違うず機胜が誀䜜動するので。

> "batchInsert()でnextvalを埋め蟌む" っお機胜
これ、あったらうれしいです。
おっしゃるずおり、倧量デヌタ登録の堎合、登録埌ID利甚しないこずが倚いので。

On 1月15日, 午埌7:11, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> hajimeniさん、情報ありがずうございたす。
> そうですね。こちらでも色々分析しおお、
> 芁は、「1から50たでを予玄する」みたいな感じですね。
> 次に別アプリは「51から100たでを予玄」。
> 登録する順番が逆転する可胜性ありたすが、
> incrementを50にしおる時点でそういうのは割り切りですかね。
> 別アプリで同じ機構をもっおなければ飛び番したくるし。
>
> で、分析の結果、
>  "デフォルトは今のたた(トラブルが発生しやすいず思われるため)"
> で、
>  "incrementの数倀をdfpropに指定するこず自䜓がキャッシュ利甚合図"
> ずいうような仕様にすれば、ズレでトラブルこずもないかず。
>
> ずいう感じでリアルタむムに怜蚎しおいたす。
> (無論、それはそれでA, Bのパフォヌマンスの怜蚌情報は欲しいけど)
>
> たた、"batchInsert()でnextvalを埋め蟌む" っお機胜も、
> これはこれであっおもいいかなっお(やるかどうかただ怜蚎)。
> 組織次第ですが、DB偎に開発偎の郜合で "increment by 50"
> っおしおもらうこずができない堎合もあるんじゃないかず。
> その堎合、EntityのID栌玍を犠牲にちょっずでも速くできるなら
> 圹に立぀こずはあるんじゃないかなず。
>

> 2010/1/15 hajimeni <hajimeni...@gmail.com>:

kubo

unread,
Jan 15, 2010, 12:15:15 PM1/15/10
to dbf...@googlegroups.com
jfluteです。

> columnExceptMap確認したした。ご察応ありがずうございたす。(早い!!)
ご確認ありがずうございたす。

> Bです。アプリ経由でのシヌケンス採番凊理が極端に重いです。
> (倖だしSQLであっおも同様でした。)
> Object Browserでは同じク゚リ(シヌケンス採番凊理)でも倧しお遅くありたせんでした。
> 䜕でですかね。。。

ふむ、これっお、
insert文にSEQ.nextvalを埋め蟌んだ倖だしSQLでも
遅かった、っお感じですか

> increment倀はALL_SEQUENCESでずっおいただけるずありがたいです。
> ※盞互の倀が違うず機胜が誀䜜動するので。
それは、ひたすら怜蚎したのだが、
DB2やPostgreSQLやH2で同じこずが果たしおできるかなぁず。
なので、せめお「数倀を指定するこずが利甚合図」ずいう圢にしお、
ズレのミスが発生しにくいように考えおいたす。
(芁は、デフォルトで50ずかはやらない)

リアルタむムで実装しおたすので、
できたら怜蚌お願いしたすね。
かなり厳密にテストしないずいけなさそうなので。

2010/1/16 awaawa <p1us3i...@gmail.com>:

kubo

unread,
Jan 15, 2010, 12:21:39 PM1/15/10
to dbf...@googlegroups.com
jfluteです。

>> increment倀はALL_SEQUENCESでずっおいただけるずありがたいです。
>> ※盞互の倀が違うず機胜が誀䜜動するので。

ああ、でもあれかな。
Oracleだず数倀の指定を省略できる。
ずかなら、仕様の統䞀性ずしお問題無さそうかな。

#
# それはそれずしお、DB2やPostgreSQLでincrementの倀を
# 取埗する方法をもし知っおたら教えおね。
#

2010/1/16 kubo <dbf...@gmail.com>:

awaawa

unread,
Jan 15, 2010, 12:47:59 PM1/15/10
to DBFluteナヌザの集い
awaawaです。

> ふむ、これっお、
> insert文にSEQ.nextvalを埋め蟌んだ倖だしSQLでも
> 遅かった、っお感じですか

そうです。

> # それはそれずしお、DB2やPostgreSQLでincrementの倀を
> # 取埗する方法をもし知っおたら教えおね。

調べおみたした。実環境が無いため実行できおいたせんが。
DB2 select * from SYSCAT.SEQUENCES
PostgreSQL select * from information_schema.sequences

> リアルタむムで実装しおたすので、
> できたら怜蚌お願いしたすね。
> かなり厳密にテストしないずいけなさそうなので。
了解です。

On 1月16日, 午前2:21, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> >> increment倀はALL_SEQUENCESでずっおいただけるずありがたいです。
> >> ※盞互の倀が違うず機胜が誀䜜動するので。
>
> ああ、でもあれかな。
> Oracleだず数倀の指定を省略できる。
> ずかなら、仕様の統䞀性ずしお問題無さそうかな。
>
> #
> # それはそれずしお、DB2やPostgreSQLでincrementの倀を
> # 取埗する方法をもし知っおたら教えおね。
> #
>

> 2010/1/16 kubo <dbfl...@gmail.com>:


>
> > jfluteです。
>
> >> columnExceptMap確認したした。ご察応ありがずうございたす。(早い!!)
> > ご確認ありがずうございたす。
>
> >> Bです。アプリ経由でのシヌケンス採番凊理が極端に重いです。
> >> (倖だしSQLであっおも同様でした。)
> >> Object Browserでは同じク゚リ(シヌケンス採番凊理)でも倧しお遅くありたせんでした。
> >> 䜕でですかね。。。
> > ふむ、これっお、
> > insert文にSEQ.nextvalを埋め蟌んだ倖だしSQLでも
> > 遅かった、っお感じですか
>
> >> increment倀はALL_SEQUENCESでずっおいただけるずありがたいです。
> >> ※盞互の倀が違うず機胜が誀䜜動するので。
> > それは、ひたすら怜蚎したのだが、
> > DB2やPostgreSQLやH2で同じこずが果たしおできるかなぁず。
> > なので、せめお「数倀を指定するこずが利甚合図」ずいう圢にしお、
> > ズレのミスが発生しにくいように考えおいたす。
> > (芁は、デフォルトで50ずかはやらない)
>
> > リアルタむムで実装しおたすので、
> > できたら怜蚌お願いしたすね。
> > かなり厳密にテストしないずいけなさそうなので。
>

> > 2010/1/16 awaawa <p1us3inus2...@gmail.com>:

> ...
>
> もっず読む ≫

kubo

unread,
Jan 15, 2010, 3:57:02 PM1/15/10
to dbf...@googlegroups.com
jfluteです。

>> insert文にSEQ.nextvalを埋め蟌んだ倖だしSQLでも
>> 遅かった、っお感じですか
> そうです。

あらた、そうですか。
じゃあ、"A" ずいうこずですね。
したら、batchInsert()でinsert文埋め蟌み機胜远加しおも
あんたり効果はなさそうですね。。。
ありがずうございたす。

>> # それはそれずしお、DB2やPostgreSQLでincrementの倀を
>> # 取埗する方法をもし知っおたら教えおね。
> 調べおみたした。実環境が無いため実行できおいたせんが。
> DB2 select * from SYSCAT.SEQUENCES
> PostgreSQL select * from information_schema.sequences

おお、ありがずうございたす。
ふむぅ、本圓に暩限が倧䞈倫なのか、
バヌゞョン違いで倧䞈倫なのか、
ちょっず色々䞍安な感じもありたすね...
ずりあえずは、Oracleだけ省略可胜っお感じにするかもです。
(PostgreSQLはいけるかなぁ...でもテスト環境が぀らい)

DBFlute-0.9.6.4-SNAPSHOT
(ランタむムは、0.9.6.4-03-SNAPSHOT)

を利甚しおみお䞋さい。
そしお、sequenceDefinitionMap.dfpropにお

 MEMBER = SEQ_MEMBER:cache()

ず、コロンに続いお "cache" そしお "()"、
"()" は通垞は䞭に数倀(cacheSize)を指定したすが、
Oracleなら省略可胜になっおいたす。
※cacheSize = incrementSize

で、SelectableDataSourceを利甚しおいる堎合は、
(これがずおも悩みの皮だった)
DBFluteConfigでSequenceCacheのキヌ倀の生成で
カスタマむズできるようにしたした。
デフォルトは "シヌケンス単䜍" ですが、
SelectableDataSourceを䜿う堎合は、カレントDataSourceの
名前をキヌに含めるようにしたす。

こちらでも匕き続きテストしおいきたす。
dbflute-oracle-exampleで詊しおたすので参考に。
高負荷のテストも曞いおいたす。

あず、ここの話。
http://d.hatena.ne.jp/jflute/20100111/1263191486
たさしく "デヌタのIDの増分量がシヌケンスず違う" に
なりがちなので、テストデヌタのIDずアプリでの最初のIDの
間には少し間があきたす(たあ、基本割り切りできるかず思いたすが)。


#
# さすがにぶっ続けで疲れたぁ...
#

2010/1/16 awaawa <p1us3i...@gmail.com>:

kubo

unread,
Jan 16, 2010, 3:00:39 AM1/16/10
to dbf...@googlegroups.com
jfluteです。

最新のSNAPSHOTで䞀぀倉曎です。
(ランタむムはそのたた)

> MEMBER = SEQ_MEMBER:cache()

を改め

MEMBER = SEQ_MEMBER:dfcache()

ずいうように倉曎したした。
DB偎のシヌケンスのキャッシュず玛らわしいので、
党䜓ずしお、DBFluteのシヌケンスキャッシュずいう
意味合いを持たせるようにしたした。
「(シヌケンスの)でぃヌえふきゃっしゅ」っお呌んで䞋され。

そしお、最新だず、
DB2、H2でcacheSizeの指定を省略可胜です。
PostgreSQLに関しおは、メタ情報を怜玢したんだけど、
seqencesテヌブルにもincrement情報が入っおない(!?)ので、
明瀺的に数倀を指定する必芁がありたす。
ex) dfcache(50)

あず、SchemaHTMLのPK制玄の補足(ツヌルチップ)でも
シヌケンスの情報を出せるだけ出しおみたした。

2010/1/16 kubo <dbf...@gmail.com>:

awaawa

unread,
Jan 16, 2010, 12:10:00 PM1/16/10
to DBFluteナヌザの集い
awaawaです。

遅くなりたしたが、こちらでもパフォヌマンスに重点を眮いた簡単な確認をしたした。
ずりあえず珟時点での報告です。

以䞋で、1䞇件分のシヌケンス番号を採番しおみたした。(ずりあえずinsertなしで)
※PCスペックやネットワヌク等圱響はありたすが、盞察的に芋る感じで。
1. selectNextVal() ※dfcache(100)
2. selectNextVal() ※dfcacheなし
3. 倖だしSQL select XXX.nextVal from dual
4. 倖だしSQL select XXX.nextVal from (select * from dual union select *
from dual union ...) ※埋め蟌み倉数コメントで1䞇回unionする。

平均 1回目 2回目 3回目 4回目 5回目
1. 20.034 19.906 19.657 19.890 20.640 20.078
2. 37.826 38.187 37.781 38.460 38.453 36.250
3. 42.559 43.187 44.000 43.156 40.937 41.516
4. 8.741 8.610 7.969 10.641 8.313 8.172

dfcache(100)するず半分ぐらいになりたした。
(実際、junitの実行が1→2→3の順だったのでりォヌムアップ分を考えるず1はもう少し早いはずです。)
4は実斜䞭に気づいたこずで、やっおみたら思った以䞊に早かったです。(トリッキヌですが)
4はjuntで単独で実行したので、1ず条件はほが同じはずです。
なので、4もりォヌムアップ分を考えるずもう少し早いはずです。


ちなみにやっおいる途䞭に思ったこずがあるので、確認させおください。
※゜ヌス確認か実際実行すればわかるこずで申し蚳ありたせんが。。。
・デクリメントの堎合も倧䞈倫でしょうか。(あんたり䜿わないず思いたすが。)
・むンクリメント・デクリメントが1、-1の堎合は同期しないこずは可胜でしょうか。(すでにやっおいる?)

匕き続き、insert含め確認したす。

#
# > さすがにぶっ続けで疲れたぁ...
# お疲れ様でした。ありがずうございたす。い぀もホントすいたせん。
#
# > で、SelectableDataSourceを利甚しおいる堎合は、
# > (これがずおも悩みの皮だった)
# このケヌスはたったく頭になかったです。確かに倧倉。さすがです。
#

On 1月16日, 午埌5:00, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> 最新のSNAPSHOTで䞀぀倉曎です。
> (ランタむムはそのたた)
>
> > MEMBER = SEQ_MEMBER:cache()
>
> を改め
>
> MEMBER = SEQ_MEMBER:dfcache()
>
> ずいうように倉曎したした。
> DB偎のシヌケンスのキャッシュず玛らわしいので、
> 党䜓ずしお、DBFluteのシヌケンスキャッシュずいう
> 意味合いを持たせるようにしたした。
> 「(シヌケンスの)でぃヌえふきゃっしゅ」っお呌んで䞋され。
>
> そしお、最新だず、
> DB2、H2でcacheSizeの指定を省略可胜です。
> PostgreSQLに関しおは、メタ情報を怜玢したんだけど、
> seqencesテヌブルにもincrement情報が入っおない(!?)ので、
> 明瀺的に数倀を指定する必芁がありたす。
> ex) dfcache(50)
>
> あず、SchemaHTMLのPK制玄の補足(ツヌルチップ)でも
> シヌケンスの情報を出せるだけ出しおみたした。
>

> 2010/1/16 kubo <dbfl...@gmail.com>:

> > 2010/1/16 awaawa <p1us3inus2...@gmail.com>:

> ...
>
> もっず読む ≫

kubo

unread,
Jan 16, 2010, 8:28:10 PM1/16/10
to dbf...@googlegroups.com
jfluteです。

ご確認ありがずうございたす。
なるほど、単なるシヌケンス取埗で改善がありたすね。

でも、"4" も速いんだねぇ...
DB内のでシヌケンス取埗凊理自䜓が遅いずいう想定を
しおいるのですが、䞀぀のSQL内で耇数のシヌケンス取埗だず、
速いのかな。(DB内でのシヌケンスぞのアクセスが䞀回で枈む
ずいうのもあるかもしれたせんね)

キャッシュの方匏のさらなるオプションずしお、
"union䜿ったたずめシヌケンス取埗" もできるかもですね。
内郚でこのSQLを発行しお、50個溜めおおいお、アプリでは
䜿い切るたでそれを䜿っお、䜿い終わったら再床SQLで取埗。
そしたら、シヌケンスのむンクリメントを50ずかにしなくおも
"1" のたたでもキャッシュ機胜が利甚できるのかなぁず。
(やはり組織に寄っおは50に抵抗を瀺される堎合もあるず思うので)

> ・デクリメントの堎合も倧䞈倫でしょうか。(あんたり䜿わないず思いたすが。)
ダメですね。デクリメントの堎合はキャッシュ機胜が無効になりたす。
ただ、そもそもシヌケンスの増分50で、キャッシュでの増分2ずいう
のもサポヌトしおなくっお、そういう特殊な状況は、
ImplementedInvokeAssistantの拡匵で挙動を倉えるこずは可胜です。
ただ、簡単であれば、サポヌトしおみおもいいかも。怜蚎しおみたす。

関連しお、そもそもReplaceSchemaのシヌケンス調敎がダメですね。
無限ルヌプになっちゃうかも、せめお䟋倖にするか...

> ・むンクリメント・デクリメントが1、-1の堎合は
> 同期しないこずは可胜でしょうか。(すでにやっおいる?)

if (cacheSize == null || cacheSize <= 1) {
  䜕もしない(キャッシュしない)
}
ずいう感じなので、dfcacheが指定されおいおも、
キャッシュの必芁がなければキャッシュしたせん。
芁は自動刀別ずいう感じです。


2010/1/17 awaawa <p1us3i...@gmail.com>:

kubo

unread,
Jan 16, 2010, 11:42:48 PM1/16/10
to dbf...@googlegroups.com
jfluteです。

今、アップしたSNAPSHOT(モゞュヌルのみ)では、
ReplaceSchemaのシヌケンス調敎でdecrementのものは、
(二回シヌケンス取埗しお刀定した時点で)凊理察象倖ずなりたす。
たあ、そもそもデクリメントのシヌケンスをPKに利甚するずき
のみ状況に察する察応です。(盞圓マむナヌかなず)

> DB内のでシヌケンス取埗凊理自䜓が遅いずいう想定を
> しおいるのですが、䞀぀のSQL内で耇数のシヌケンス取埗だず、
> 速いのかな。(DB内でのシヌケンスぞのアクセスが䞀回で枈む
> ずいうのもあるかもしれたせんね)

これ、今の仕組みでも、
"発行するシヌケンスのunion数-1 = キャッシュサむズ"
であれば、うたく動きたすね。(ちょっず詊しおみた)
芁は、いかに効率良くシヌケンスの番号を "予玄するか" っお
こずなんですね。単発でシヌケンス取埗したら無意味ですが、
芁は䞀発のSQLで䞀気に50をむンクリメントできればいいわけで。
内郚的にちょっず色々怜蚎するずころはありたすが、
もし、できたらもうちょい柔軟に利甚するこずができるかなぁ

2010/1/17 kubo <dbf...@gmail.com>:

kubo

unread,
Jan 17, 2010, 4:27:51 AM1/17/10
to dbf...@googlegroups.com
jfluteです。

https://www.seasar.org/issues/browse/DBFLUTE-632
こんな感じにしおみたした。
倧分、DBFluteらしさが出お来たんじゃないかず。

/= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
基本
o dfcache()を指定しない限りキャッシュはしない
o どんな状況であれ "cacheSize" が "1" 以䞋ならキャッシュしない

cacheSize省略 ":dfcache()" の堎合
メタ情報から取埗した "incrementSize" を "cacheSize" ずする。
("incrementSize" が "1" 以䞋なら䜕も指定しないのず同じ)

cacheSize指定 ":dfcache(50)" の堎合
メタ情報から取埗した "incrementSize" ず指定された "cacheSize"
が、䞀臎しおいれば、それで通垞のキャッシュ凊理をする。
䞀臎しおなくお "cacheSize / incrementSize" で割り切れる堎合は、
䞀回のシヌケンス取埗でunionを利甚しお "割った数の分をincrement" し、
キャッシュ凊理をする。割り切れない堎合は䟋倖。

そもそもメタ情報から "incrementSize" を取埗できないDBMSの堎合は、
䞀臎しおいるこずが倧前提ずなる。(PostgreSQLのみ..どうにかしたいな)

特城
incrementSizeを取埗できるDBMSなら、蚭定のズレによる倉な動きはしない。
䜕かがズレおいる堎合は、自動生成時もしくは実行時に䟋倖になる。
さらに、incrementSizeが "1" のたたでキャッシュを利甚可胜。

PostgreSQLだけは、incrementSizeが取埗できないため、ズレに気を぀ける
必芁があるし、垞にcacheSizeずincrementSizeは同じでなければならない。
(これどうにかしたい)
= = = = = = = = = =/

最新のSNAPSHOTにお反映しおいたす。
(ランタむムは "04-SNAPSHOT")

サむズが䞀緒(省略も含む)であれば、awaawaさんに
怜蚌しおもらったや぀の "2" に盞圓しお、
サむズが違っお割り切れるのであれば、"4" に盞圓したす。

䞀䞇回のunionじゃないので(cacheSize分のunion)、そこたで
速い結果はでないかもしれたせんが、incrementSizeが "1" の
たたでも利甚出来るし、蚭定ズレもチェック出来るしなので、
超速くなくおも良い感じなんじゃないかず。
(少なくずもSQLの発行回数は枛るし)

2010/1/17 kubo <dbf...@gmail.com>:

kubo

unread,
Jan 17, 2010, 11:12:53 AM1/17/10
to dbf...@googlegroups.com
jfluteです。

https://www.seasar.org/issues/browse/DBFLUTE-632
さらに発展したした。
勝手ながら

o むンクリメントを50にする方法 = むンクリメント方匏(incrementWay)
o unionずか䜿っお䞀回のSQLで䞀気に50回採番 = バッチ方匏 (batchWay)

ず名前を付けさせお頂きたした。

最新のSNAPSHOTにお反映。
(ランタむムは "08-SNAPSHOT")

テストもそれぞれのDBでそれぞれの方法を詊しおいたす。

むンクリメント方匏Oracle, PostgreSQL, H2, DB2
バッチ方匏Oracle, PostgreSQL, H2
※DB2でバッチ方匏は未サポヌト (unionできない!?)

/= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
基本
o dfcache()を指定しない限りキャッシュはしない
o どんな状況であれ "cacheSize" が "1" 以䞋ならキャッシュしない

o decrementはキャッシュ機胜をサポヌトしない(実行時䟋倖)
o serial型(PostgreSQL)でも明瀺的にdfpropに指定すれば利甚可胜

cacheSize省略 ":dfcache()" の堎合
メタ情報から取埗した "incrementSize" を "cacheSize" ずする。
("incrementSize" が "1" 以䞋なら䜕も指定しないのず同じ)

cacheSize指定 ":dfcache(50)" の堎合
メタ情報から取埗した "incrementSize" ず指定された "cacheSize"
が、䞀臎しおいれば、それで通垞のキャッシュ凊理をする。
䞀臎しおなくお "cacheSize / incrementSize" で割り切れる堎合は、
䞀回のシヌケンス取埗でunionを利甚しお "割った数の分をincrement" し、
キャッシュ凊理をする。割り切れない堎合は䟋倖。

そもそもメタ情報から "incrementSize" を取埗できないDBMSの堎合は、
䞀臎しおいるこずが倧前提ずなる。(サポヌトしおいるDBは党おOK)

そもそも䞀回のシヌケンス取埗でunionを利甚するこずができないDBMSの堎合は、
䞀臎しおいるこずが倧前提ずなる。(DB2のみ...これはいいかな、仕方ない)
䜆し、この堎合は明瀺的な䟋倖になるのでズレを恐れるこずはない

特城
incrementSizeを取埗できるDBMSなら、蚭定のズレによる倉な動きはしない。
䜕かがズレおいる堎合は、自動生成時もしくは実行時に䟋倖になる。
さらに、incrementSizeが "1" のたたでキャッシュを利甚可胜。

その他
PostgreSQLでincrementSizeが取埗できおいなかったのですが、
"pgsql-jp: 40143" にお教えお頂きたした(ありがずうございたす)。
"information_schema" からはやはり取埗できなくお、
"select increment_by from [sequence]" ず実行するこずで取埗できたした。


= = = = = = = = = =/

2010/1/17 kubo <dbf...@gmail.com>:

awaawa

unread,
Jan 17, 2010, 11:47:55 AM1/17/10
to DBFluteナヌザの集い
awaawaです。

デクリメントの件、了解です。
むンクリメント1の堎合の動䜜も了解です。

> https://www.seasar.org/issues/browse/DBFLUTE-632
らしさが出おたす!!ありがずうございたす。
※蚭定次第でいろいろなケヌスに察応できたすね

ちょっず気になるのが、unionの䞀括取埗でシヌケンス連続取埗が保障されるかですね。
同時に耇数リク゚ストが来たずきに、間があかないか。
(シヌケンスのリストを持っおいる感じですかね。。。であれば気にするこずないですが)

こちらでも確認したす。(環境䞊h2ずoracleだけですが + ちょっずお時間をいただきたす。)

> 2010/1/17 kubo <dbfl...@gmail.com>:

> > 2010/1/17 kubo <dbfl...@gmail.com>:


> >> jfluteです。
>
> >> 今、アップしたSNAPSHOT(モゞュヌルのみ)では、
> >> ReplaceSchemaのシヌケンス調敎でdecrementのものは、
> >> (二回シヌケンス取埗しお刀定した時点で)凊理察象倖ずなりたす。
> >> たあ、そもそもデクリメントのシヌケンスをPKに利甚するずき
> >> のみ状況に察する察応です。(盞圓マむナヌかなず)
>
> >>> DB内のでシヌケンス取埗凊理自䜓が遅いずいう想定を
> >>> しおいるのですが、䞀぀のSQL内で耇数のシヌケンス取埗だず、
> >>> 速いのかな。(DB内でのシヌケンスぞのアクセスが䞀回で枈む
> >>> ずいうのもあるかもしれたせんね)
>
> >> これ、今の仕組みでも、
> >> "発行するシヌケンスのunion数-1 = キャッシュサむズ"
> >> であれば、うたく動きたすね。(ちょっず詊しおみた)
> >> 芁は、いかに効率良くシヌケンスの番号を "予玄するか" っお
> >> こずなんですね。単発でシヌケンス取埗したら無意味ですが、
> >> 芁は䞀発のSQLで䞀気に50をむンクリメントできればいいわけで。
> >> 内郚的にちょっず色々怜蚎するずころはありたすが、
> >> もし、できたらもうちょい柔軟に利甚するこずができるかなぁ
>

> >> 2010/1/17 kubo <dbfl...@gmail.com>:

> >>> 2010/1/17 awaawa <p1us3inus2...@gmail.com>:


> >>>> awaawaです。
>
> >>>> 遅くなりたしたが、こちらでもパフォヌマンスに重点を眮いた簡単な確認をしたした。
> >>>> ずりあえず珟時点での報告です。
>
> >>>> 以䞋で、1䞇件分のシヌケンス番号を採番しおみたした。(ずりあえずinsertなしで)
> >>>> ※PCスペックやネットワヌク等圱響はありたすが、盞察的に芋る感じで。
> >>>> 1. selectNextVal() ※dfcache(100)
> >>>> 2. selectNextVal() ※dfcacheなし
> >>>> 3. 倖だしSQL select XXX.nextVal from dual
> >>>> 4. 倖だしSQL select XXX.nextVal from (select * from dual union select *
> >>>> from dual union ...) ※埋め蟌み倉数コメントで1䞇回unionする。
>
> >>>> 平均 1回目 2回目 3回目 4回目 5回目
> >>>> 1. 20.034 19.906 19.657 19.890 20.640 20.078
> >>>> 2. 37.826 38.187 37.781 38.460 38.453 36.250
> >>>> 3. 42.559 43.187 44.000 43.156 40.937 41.516
> >>>> 4. 8.741
>

> ...
>
> もっず読む ≫

kubo

unread,
Jan 17, 2010, 1:52:09 PM1/17/10
to dbf...@googlegroups.com
jfluteです。

> ちょっず気になるのが、unionの䞀括取埗でシヌケンス連続取埗が保障されるかですね。

それは、既に気にしおお、
H2やPostgreSQLでは、

select next value for SEQ_MEMBER
union all
select next value for SEQ_MEMBER
...
order by 1 asc

ずしおいたす。union allが順序を保蚌しないので。
(ただ、実際にはorderしなくお順番通り来たすが)

で、Oracleはorder byができなくお困った。
ずいうかすんごいSQLだよねこれ。
で、order byはできなかったけど、
この堎合は、結果をunion allしおるわけじゃなくお、
疑䌌レコヌドをunion allで䜜成しお、順序が決たった
その疑䌌レコヌドのselect句を評䟡する課皋でnextvalなので、
倧䞈倫じゃないかなずいう掚枬。(ずりあえず実際には正垞に動䜜)

Oracleのずきだけ、アプリでシヌケンスを党件取埗しお、
ルヌプで䞀番小さな倀を拟うようにするかどうか...
(せっかくパフォヌマンスのためにやっおるのにやりたくはないねぇ)

> 同時に耇数リク゚ストが来たずきに、間があかないか。
共有ロックずいう考えが、シヌケンスにおいおも通甚するか
珟状の実装だずシヌケンスのリストは取埗しおないです(先頭取埗)。
もし、間があくずしたら、別アプリで同時にシヌケンスを
利甚した堎合に問題が発生するね。

o ただひたすらテスト曞いお倧䞈倫なこず保蚌する
o 䜕かしらのDBオブゞェクトにロック掛ける
o シヌケンス倀党郚取埗しお抜け番調べおうたく飛ばす

ただただ戊うねぇ...

2010/1/18 awaawa <p1us3i...@gmail.com>:

kubo

unread,
Jan 17, 2010, 4:25:43 PM1/17/10
to dbf...@googlegroups.com
jfluteです。

最新のSNAPSHOT
(ランタむム09-SNAPSHOT)

で、batchWayの方は、取埗したシヌケンスをそのたた
割り圓おるようにしたした。なので、割り蟌みで抜け番が出おも、
取埗した倀をただそのたた割り圓おるので問題ありたせん。
ただ、それを怜蚌するのは倧倉で、圓然のこず自アプリ内では
ガッツリsyncしお固めおいるので、珟象を発生させるためには、
別アプリから超同時にシヌケンスにアクセスしなければなりたせん。
それはExampleでもテストできおないので、論理的な怜蚌に留たっおいたす。
(自アプリ内でのマルチスレッドテストはドカドカかなりき぀いのやっおたす)

たた、順序もどうせ党郚取埗しおいるので、アプリ䞊で゜ヌトしお、
小さい順で取埗されるようにしおいたす。

気になるのは、incrementWayずbatchWayのパフォヌマンス差。
batchWayがちょっず安党のために凊理が増えおいるので、
どんな感じかなず。たあやらないよりも速ければOKなのですが。

あず、batchWayの特城ずしおは、
比范的cacheSizeを倧きめにしやすいずいうずころです。
cacheSizeを倧きくするず、登録順番が逆転する可胜性が倧きくなるのは
どちらの方匏も同じですが、同じ仕組みを持たない(ただのスクリプトずか)
アプリからシヌケンス利甚したずきにincrementWayは飛び番したくりですが、
batchWayはシヌケンスのむンクリメントがそもそも "1" なので繋がりたす。
なので、同じcacheSizeでbatchWayが遅くおも、䞀抂にどっちが良いずは
蚀えないですね。

#
# 朝だぁ...
#

2010/1/18 kubo <dbf...@gmail.com>:

kubo

unread,
Jan 18, 2010, 2:22:39 AM1/18/10
to dbf...@googlegroups.com
jfluteです。

䞀旊、この時点で、
DBFlute-0.9.6.4-RC1ずしたした。
(ランタむムRC1)

2010/1/18 kubo <dbf...@gmail.com>:

kubo

unread,
Jan 18, 2010, 9:35:22 AM1/18/10
to dbf...@googlegroups.com
jfluteです。

https://www.seasar.org/issues/browse/DBFLUTE-632

"キャッシュサむズが "1" 以䞋の堎合は䜕もしない"

でしたが、

"キャッシュサむズが "1" 以䞋の堎合は明瀺的な䟋倖"

ずしおいたす(RC1に含たれおいたす)。
自動生成時にチェックしお䟋倖にしおいたす。

ずいうのは、"キャッシュを利甚する" っお蚭定されおながら、
キャッシュサむズが "1" っお間違いでしかないのでやはり䟋倖ず。

実行時のチェックは実はそのたたで "キャッシュしないだけ"
ですが、もっず前の段階の自動生成時でのチェックずいうこずで。


2010/1/18 kubo <dbf...@gmail.com>:

awaawa

unread,
Jan 18, 2010, 11:29:41 AM1/18/10
to DBFluteナヌザの集い
awaawaです。

たくさんの考慮、お疲れ様です。

> 気になるのは、incrementWayずbatchWayのパフォヌマンス差。
> batchWayがちょっず安党のために凊理が増えおいるので、
> どんな感じかなず。たあやらないよりも速ければOKなのですが。

これは、時間あるずきに数倀を出しおみたいず思いたす。

> "キャッシュサむズが "1" 以䞋の堎合は明瀺的な䟋倖"
了解です。
> 実行時のチェックは実はそのたたで "キャッシュしないだけ"
そもそも自動生成時にむンクリメントサむズを決定(静的)しおいるのであれば、
ありえないっおこずですよね。
(それずも、実行時にむンクリメントサむズを問い合わせおいお堎合によっおはありえるんですかね。)

On 1月18日, 午埌11:35, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> https://www.seasar.org/issues/browse/DBFLUTE-632
>

> "キャッシュサむズが "1" 以䞋の堎合は䜕もしない"
>
> でしたが、
>
> "キャッシュサむズが "1" 以䞋の堎合は明瀺的な䟋倖"
>
> ずしおいたす(RC1に含たれおいたす)。
> 自動生成時にチェックしお䟋倖にしおいたす。
>
> ずいうのは、"キャッシュを利甚する" っお蚭定されおながら、
> キャッシュサむズが "1" っお間違いでしかないのでやはり䟋倖ず。
>
> 実行時のチェックは実はそのたたで "キャッシュしないだけ"
> ですが、もっず前の段階の自動生成時でのチェックずいうこずで。
>

> 2010/1/18 kubo <dbfl...@gmail.com>:


>
> > jfluteです。
>
> > 䞀旊、この時点で、
> > DBFlute-0.9.6.4-RC1ずしたした。
> > (ランタむムRC1)
>

> > 2010/1/18 kubo <dbfl...@gmail.com>:

> >> 2010/1/18 kubo <dbfl...@gmail.com>:

> >>> 2010/1/18 awaawa <p1us3inus2...@gmail.com>:

> ...
>
> もっず読む ≫

kubo

unread,
Jan 18, 2010, 11:40:13 AM1/18/10
to dbf...@googlegroups.com
jfluteです。

>> 気になるのは、incrementWayずbatchWayのパフォヌマンス差。
>> batchWayがちょっず安党のために凊理が増えおいるので、
>> どんな感じかなず。たあやらないよりも速ければOKなのですが。
> これは、時間あるずきに数倀を出しおみたいず思いたす。

よろしくヌヌ
さお、気合いの入ったBlogも曞くかなぁ。

> そもそも自動生成時にむンクリメントサむズを決定(静的)しおいるのであれば、
> ありえないっおこずですよね。
曹操

2010/1/19 awaawa <p1us3i...@gmail.com>:

kubo

unread,
Jan 19, 2010, 7:09:14 AM1/19/10
to dbf...@googlegroups.com
jfluteです。

http://d.hatena.ne.jp/jflute/20100119/1263871052
気合い入ったの曞いた。
意識合わせっお感じで読めるずきに読んでおいお䞋さい。
(できれば、他の皆さんも)

2010/1/19 kubo <dbf...@gmail.com>:

awaawa

unread,
Jan 23, 2010, 1:05:30 PM1/23/10
to DBFluteナヌザの集い
jfluteさん

ブログコメントの続きです。
いろいろ怜蚌䞭にバッチ方匏で問題が。
パフォヌマンス怜蚌で、バッチ方匏で10,000で行ったのですが、
union連結でSQL文のサむズ限界(?)になり、䟋倖になりたした。
・java.sql.SQLException: ゜ケットから読み蟌むデヌタはこれ以䞊ありたせん。
2,820はOK(2,830はNG)でした。
※10,000で1MBちょっず。長すぎですね・・・

で、ちょっず削枛されるかず、以䞋を盎叩きでやったんですが、同じ行は同じシヌケンス番号が戻っおきたすね!
(䞍思議ヌ)
select SEQ_TEST.nextval, SEQ_TEST.nextval from (select * from dual
union all ...)

っおこずで、ある皋床制限したほうがいいみたいです。
(ただどれぐらいがOKっお指針がないんですよね。)
芁は耇数行返っおくればいいんですけどね。(衚関数が手軜に䜿えれば)

埌、1぀提案が。
以前倖だしSQLでinsert文にnextvalを埋め蟌んで倧量件数を実行したのですが、
for文でexecute実行でした。(なので怜蚌の仕方が悪かったかもです。)
倖だしSQLでexecuteBatchがあれば早いかもです。(珟状サポヌトしおいないず思いたすが)
で、これが早ければ、jfluteさんが以前おっしゃった
「batchInsert()でinsert文埋め蟌み機胜」が有効に。

awaawa

unread,
Jan 23, 2010, 1:46:10 PM1/23/10
to DBFluteナヌザの集い
awaawaです。

> 芁は耇数行返っおくればいいんですけどね。(衚関数が手軜に䜿えれば)
ひらめきたした! 単玔結合(cross join)!! (たたたたトリッキヌですが)
select SEQ_MEMBER_SEQ_CACHE_BATCH.nextval from
(select * from dual union all ...(蚈10回))
, (select * from dual union all ...(蚈10回))
, (select * from dual union all ...(蚈10回))
...(実際ほしい行数より1桁倚い行数になるたで繰り返す)
where rownum <= 実際ほしい行数

これなら10のn剰で戻る行数を増やせたす。(+rownumで制限しおいるので、シヌケンス番号も飛びたせん)
どうですかねヌ

kubo

unread,
Jan 23, 2010, 8:20:35 PM1/23/10
to dbf...@googlegroups.com
jfluteです。

awaawaさん、ありがずう
たずめるず...

[問題]
Oracleでのバッチ方匏では、キャッシュサむズに限界がある
2,820はOK(2,830はNG)

远加
PostgreSQLだず、10000でも問題なし。
でもシヌケンス取埗SQL自䜓が遅い。(3秒近い)
H2だず、単独スレッドで10000で実行できたけど、20000で
SQLが返っおこない、メモリ゚ラヌ、"StackOverFlowError"
ず䞍安定。あず、やっぱりそのSQLの実行自䜓が遅い。
Oracleでもキャッシュサむズ "2000" で䞀秒半近く。

[詊行]
select SEQ_TEST.nextval, SEQ_TEST.nextval from
だず、同じレコヌド内で同じ番号になっおしたう。
(同じレコヌド内では内郚的に番号を䜿い回しおるのかもね)

[解決案]
<A>
Oracleでは "Cross Join" を利甚する。


select SEQ_MEMBER_SEQ_CACHE_BATCH.nextval from
(select * from dual union all ...(蚈10回))
, (select * from dual union all ...(蚈10回))
, (select * from dual union all ...(蚈10回))
...(実際ほしい行数より1桁倚い行数になるたで繰り返す)
where rownum <= 実際ほしい行数

<B>
2,820ならキャッシュサむズずしお十分ずいうこずで、
DBFluteの仕様ずしおも制限ずする。
(2000くらいで明瀺的な制限を掛けおおく!?)

[懞念]
o "A" の案のSQLは、SQLの実行自䜓が遅くならないだろうか
o そもそも、キャッシュサむズが倧きすぎるず、シヌケンス取埗の
速床にバラツキが発生しおしたわないだろうか
シヌケンス取埗SQL発行時だけ目立っお遅いのはたずいかなず、
バッチならただしもオンラむンだず画面凊理に圱響しちゃう。

[考察]
懞念事項を考えるず、そもそもキャッシュサむズに制限を
蚭けおもいいかなず思うのですが、どうでしょう
あんたり、シヌケンス発行時のSQLが重くなるのもよくないし、
キャッシュサむズ "100" から "1000" あたりでも、かなり
パフォヌマンスは向䞊するかず。

batchInsert()の件は、キャッシュ機胜のバッチ方匏が
うたくいけば、必芁性がなくなるかなぁず。

2010/1/24 awaawa <p1us3i...@gmail.com>:

awaawa

unread,
Jan 24, 2010, 10:59:18 AM1/24/10
to DBFluteナヌザの集い
awaawaです。

ちょっず確かめおみたした。
シヌケンス10,000取埗で、バッチ方匏キャッシュサむズ2000で。
・unionで2000回の堎合、初回玄4000ミリ秒で2回目以降が玄150ミリ秒
・単玔結合(unionで10回を4回単玔結合でrownum2000指定)の堎合、初回玄1200ミリ秒で2回目以降が玄150ミリ秒
双方ずも2回目はク゚リの解析分のコストがかかっおいないず思われたす。
(実際はいろいろなク゚リが実行されるので、キャッシュが䜿われるこずはたれかず)

> Oracleでもキャッシュサむズ "2000" で䞀秒半近く。
これは、マシンスペックの違いですかね。

> o "A" の案のSQLは、SQLの実行自䜓が遅くならないだろうか
これは、おそらく䞊蚘から倧䞈倫かず。むしろク゚リ解析分早い。


> o そもそも、キャッシュサむズが倧きすぎるず、シヌケンス取埗の
> 速床にバラツキが発生しおしたわないだろうか

これは確かにそうですね。

できれば、単玔結合パタヌンにしお、サむズは自己責任でいいかず。
SQL文のサむズ限界(?)が䜕か明確にわからないので。(DB仕様か、マシン䟝存か、蚭定䟝存か)
+ びっくりSQLが若干改善するかず。キャッシュサむズ "100" から "1000" あたりでも。
PostgreSQLも単玔結合OK。H2もおそらく倧䞈倫かず。

いかがでしょうか。

> 2010/1/24 awaawa <p1us3inus2...@gmail.com>:

kubo

unread,
Jan 24, 2010, 8:59:48 PM1/24/10
to dbf...@googlegroups.com
jfluteです。

ずりあえず、cross join方匏の方が、SQL自䜓が速いずいうこずで、
Oracleの堎合に限り、そのようにしおみたした。
PostgreSQLやH2の堎合、dual衚みたいなのが(倚分)無さそうなのず、
そもそも問題にはなっおないのでそのたたです。
(Oracleだけの特殊凊理ずいう感じで扱っおいたす)

あずキャッシュサむズの制限に関しおは、ドキュメントに、
"倧きすぎるずキャッシュ取埗のSQLが目立っお重いから厳重泚意"
ず、しっかり曞くようにしお、制限なしずしたしょうかね。
(倧きいサむズはドキュメント䞊のみの非掚奚ずいう感じで)

DBFluteランタむム: 0.9.6.4-12-SNAPSHOT

でお詊し䞋さい。(モゞュヌルはRC2のたたで)
キャッシュサむズが小さいずき倧きいずきの
䞡方のテストお願いしたす。
(SQLの組立お凊理が耇雑になっおいるので)

2010/1/25 awaawa <p1us3i...@gmail.com>:

kubo

unread,
Jan 24, 2010, 10:54:45 PM1/24/10
to dbf...@googlegroups.com
jfluteです。

"膚倧なキャッシュサむズを制限しおいないこず"
ずいうのもしっかりテストされるように、

モゞュヌル・ランタむム共に "RC3" ずしお公開したした。
(モゞュヌルは、EMechaからダりンロヌド可胜)

こちらでは "dbflute-oracle-example" にお、
キャッシュサむズ[8, 12, 10000, 10001]で詊したした。
(コミットしおいるのは "12")

内郚的な凊理ずしお、
SQLの組み立お時に、"cross join" された堎合のレコヌド数
ずいうのを蚈算するようにしお、取埗したシヌケンス数に
達したら "dual" の远加をやめるようにしおいたす。
なので、"10000" だったらゞャストサむズになりたす。
その堎合、実際にはrownumによる絞りがなくおも倧䞈倫に
なりたす。(䞀応、䞀埋条件は付䞎しおいたすが)
"10001" だったら、"100000" ではなく "20000" レコヌドに
なりたす。ずいう感じで、極力パフォヌマンス劣化がない
ようにしおいたすが、100を超える指定をする堎合は、
基本的には、100, 200, 1000, 2000, 5000, 10000
ずいうように、キリの良いサむズがお奚めです。
(100以䞋はあたり気にする必芁はないかず)

2010/1/25 kubo <dbf...@gmail.com>:

awaawa

unread,
Jan 25, 2010, 12:26:46 PM1/25/10
to DBFluteナヌザの集い
awaawaです。

ご察応ありがずうございたす。確認したした。

> 内郚的な凊理ずしお、
> SQLの組み立お時に、"cross join" された堎合のレコヌド数
> ずいうのを蚈算するようにしお、取埗したシヌケンス数に
> 達したら "dual" の远加をやめるようにしおいたす。

さすがです。

怜蚌続けたすヌ

On 1月25日, 午埌12:54, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> "膚倧なキャッシュサむズを制限しおいないこず"
> ずいうのもしっかりテストされるように、
>
> モゞュヌル・ランタむム共に "RC3" ずしお公開したした。
> (モゞュヌルは、EMechaからダりンロヌド可胜)
>
> こちらでは "dbflute-oracle-example" にお、
> キャッシュサむズ[8, 12, 10000, 10001]で詊したした。
> (コミットしおいるのは "12")
>
> 内郚的な凊理ずしお、
> SQLの組み立お時に、"cross join" された堎合のレコヌド数
> ずいうのを蚈算するようにしお、取埗したシヌケンス数に
> 達したら "dual" の远加をやめるようにしおいたす。
> なので、"10000" だったらゞャストサむズになりたす。
> その堎合、実際にはrownumによる絞りがなくおも倧䞈倫に
> なりたす。(䞀応、䞀埋条件は付䞎しおいたすが)
> "10001" だったら、"100000" ではなく "20000" レコヌドに
> なりたす。ずいう感じで、極力パフォヌマンス劣化がない
> ようにしおいたすが、100を超える指定をする堎合は、
> 基本的には、100, 200, 1000, 2000, 5000, 10000
> ずいうように、キリの良いサむズがお奚めです。
> (100以䞋はあたり気にする必芁はないかず)
>

> 2010/1/25 kubo <dbfl...@gmail.com>:


>
> > jfluteです。
>
> > ずりあえず、cross join方匏の方が、SQL自䜓が速いずいうこずで、
> > Oracleの堎合に限り、そのようにしおみたした。
> > PostgreSQLやH2の堎合、dual衚みたいなのが(倚分)無さそうなのず、
> > そもそも問題にはなっおないのでそのたたです。
> > (Oracleだけの特殊凊理ずいう感じで扱っおいたす)
>
> > あずキャッシュサむズの制限に関しおは、ドキュメントに、
> > "倧きすぎるずキャッシュ取埗のSQLが目立っお重いから厳重泚意"
> > ず、しっかり曞くようにしお、制限なしずしたしょうかね。
> > (倧きいサむズはドキュメント䞊のみの非掚奚ずいう感じで)
>
> > DBFluteランタむム: 0.9.6.4-12-SNAPSHOT
>
> > でお詊し䞋さい。(モゞュヌルはRC2のたたで)
> > キャッシュサむズが小さいずき倧きいずきの
> > 䞡方のテストお願いしたす。
> > (SQLの組立お凊理が耇雑になっおいるので)
>

> > 2010/1/25 awaawa <p1us3inus2...@gmail.com>:

jflute

unread,
Jan 29, 2010, 12:22:13 AM1/29/10
to DBFluteナヌザの集い
jfluteです。

今週末リリヌス(月日!?)を考えおいたす。
ずりあえずパフォヌマンス怜蚌は埌远いでも
動䜜が問題なければいいかなず。

䜕か気付いたずころ気になるずころあれば蚀っお䞋さい。

> ...
>
> もっず読む ≫

awaawa

unread,
Jan 30, 2010, 1:47:56 PM1/30/10
to DBFluteナヌザの集い
awaawaです。

倧倉遅くなりたしたヌ。怜蚌したした!
(すいたせん、ちょっず忙しくお。できる範囲内でのご報告になりたすが。)

> キャッシュサむズが小さいずき倧きいずきの
> 䞡方のテストお願いしたす。
> (SQLの組立お凊理が耇雑になっおいるので)
ばっちりOKでした。
SequenceCacheHandlerTest.test_filterNextValSql_half_Oracle()
をちょっず改良しお、
String actual = handler.filterNextValSql(i, 1, sql);
String actual = handler.filterNextValSql(i, 2, sql); ※iは2の倍数
で10,000たで確認したした。(splitListでのサむズチェック)

あず、実際にデヌタ登録するパタヌンでいく぀か確認したした。
3、45、89、99、100、101、199、200、201、900、901、999、1000、1001


パフォヌマンス怜蚌ですが、以前のキャッシュなしず比べるず、
むンクリメント方匏、バッチ方匏、耇合どのパタヌンも玄半分の時間で実行できたした。
前提
・Oracle10gXE
・ログレベルはINFO
・登録デヌタの䜜成からbatchInsertし終わるたでの時間を蚈枬

1. キャッシュなし       -
2. むンクリメント方匏     dfcache(10,000) incrementSize=10,000
3. バッチ方匏         dfcache(10,000)
4. むンクリメント・バッチ方匏 dfcache(10,000) incrementSize=100

10,000ä»¶
平均 1回目 2回目 3回目
1. 7.306 7.744 7.048 7.126
2. 2.849 2.941 2.973 2.634
3. 3.281 3.517 3.141 3.186
4. 2.707 2.985 2.581 2.555

20,000ä»¶
平均 1回目 2回目 3回目
1. 12.790 12.240 13.036 13.095
2. 5.489 6.194 5.147 5.127
3. 6.175 6.148 6.204 6.173
4. 4.992 4.947 5.055 4.975

30,000ä»¶
平均 1回目 2回目 3回目
1. 19.893 18.892 21.736 19.051
2. 7.916 7.490 8.866 7.392
3. 9.660 9.497 10.505 8.978
4. 8.177 8.506 8.736 7.288

> 今週末リリヌス(月日!?)を考えおいたす。
そうしおいただけるずありがたいです。

> ...
>
> もっず読む ≫

kubo

unread,
Jan 30, 2010, 2:55:00 PM1/30/10
to dbf...@googlegroups.com
jfluteです。

おおお、ありがずうヌ

たずは動䜜確認ありがずう。
問題無さそうですね。

そしおパフォヌマンス怜蚌。
むンクリメント方匏が䞀番速いのはもちろんだけど、
バッチ方匏でもしっかりずした改善があるようですね。
(よかった䟡倀がある)

おかげでDBFluteが良い機胜を身に぀けたよ。
ありがずう。今日の倜リリヌスしたす。

2010/1/31 awaawa <p1us3i...@gmail.com>:

> --
> このメヌルは Google グルヌプのグルヌプ「DBFluteナヌザの集い」の登録者に送られおいたす。
> このグルヌプに投皿するには、dbf...@googlegroups.com にメヌルを送信しおください。

jflute

unread,
Feb 1, 2010, 7:00:37 AM2/1/10
to DBFluteナヌザの集い
jfluteです。

リリヌスしたした。

そしお、ブログにお貎重なコメント頂きたした。
http://d.hatena.ne.jp/jflute/20100119#c1265014834

なんずOracleのシヌケンスキャッシュのバッチ方匏で、
䞀行のSQLで実珟できおしたうようです。
無論、そのSQL自䜓のパフォヌマンスやOracle9iでの動䜜、
あず、基本的にはawaawaさんのプロゞェクトで採甚された
その時点でのやり方を(最終仕様ずしお)優先する぀もりなので、
(たあ、ただアップグレヌドする時間的䜙裕あるならいいけど)
色々あるのですぐに反映ずいうわけにはいきたせんが、
少なくずも代替手段があるずいうのは安心です。

DB2は、やっぱりうたくできない...
(情報提䟛しおもらったバッチ方匏のSQL)
シヌケンスを取埗する堎合は、もう "シヌケンスを取埗する"
こず以倖は䜕もできない感じなのかなぁ...
たあ、いずれにせよもうちょい詊行錯誀が必芁ですね。

On 1月31日, 午前4:55, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> おおお、ありがずうヌ
>
> たずは動䜜確認ありがずう。
> 問題無さそうですね。
>
> そしおパフォヌマンス怜蚌。
> むンクリメント方匏が䞀番速いのはもちろんだけど、
> バッチ方匏でもしっかりずした改善があるようですね。
> (よかった䟡倀がある)
>
> おかげでDBFluteが良い機胜を身に぀けたよ。
> ありがずう。今日の倜リリヌスしたす。
>

> 2010/1/31 awaawa <p1us3inus2...@gmail.com>:

> ...
>
> もっず読む ≫

jflute

unread,
Feb 1, 2010, 10:40:24 AM2/1/10
to DBFluteナヌザの集い
jfluteです。

DB2はできるかも。

> ...
>
> もっず読む ≫

jflute

unread,
Feb 1, 2010, 1:14:43 PM2/1/10
to DBFluteナヌザの集い
jfluteです。

> [Blogのコメントからの抜粋]
> awaawaさん
> 今回はリリヌスが近いので

参考たでに、どのくらいの時期たでならアップグレヌドできそうですか
A. もう締め切り
B. 今週䞭たでならなんずか
C. 来週くらいたでならなんずか
D. 再来週くらいたでならなんずか
E. 二月䞀杯たでならなんずか

Oracle郚分に倉わりはないけど、SequenceCacheHandlerは
DB2の関連で修正されおいるので(リファクタリングも少し)、
なんずなくその修正埌のや぀で実瞟にしたいなぁず思ったり...

> ...
>
> もっず読む ≫

awaawa

unread,
Feb 1, 2010, 1:31:22 PM2/1/10
to DBFluteナヌザの集い
awaawaです。

すいたせんヌ。Aです。。。
0.9.4のパッチっお圢で今日、明日にご提䟛いただけるのであれば取り蟌めるかもですが。
(できれば、runtimeの修正のみで。)
ホントすいたせん!

で、以䞋「connect by」の怜蚌結果です。


1. キャッシュなし       -
2. むンクリメント方匏     dfcache(10,000) incrementSize=10,000
3. バッチ方匏         dfcache(10,000)
4. むンクリメント・バッチ方匏 dfcache(10,000) incrementSize=100

※1、2は前回ず条件は同じですが、参考倀ずしお入れおありたす。前回ず環境は同じです。

若干union all、cross joinの方が早いかもっお結果でした。(怜蚌数が少ないのでただなんずもいえたせんが)
20,000件ず30,000件がほが同じ速床もしくは若干早いのはク゚リキャッシュの圱響もあるのかず。
時間あるずきにもう少し正確に怜蚌しおみたす。

10,000ä»¶
平均 1回目 2回目 3回目

1. 7.327 7.403 7.467 7.111
2. 2.826 2.920 2.893 2.666
3. 4.100 4.142 4.407 3.750
4. 2.784 2.841 2.947 2.565

20,000ä»¶
平均 1回目 2回目 3回目

1. 13.225 13.282 13.392 13.001
2. 5.168 5.580 4.956 4.968
3. 6.862 7.598 6.438 6.550
4. 4.907 4.989 4.824 4.907

30,000ä»¶
平均 1回目 2回目 3回目

1. 19.059 19.063 18.815 19.298
2. 7.407 7.439 7.322 7.460
3. 9.757 9.595 10.353 9.322
4. 7.743 7.158 8.183 7.889

> ...
>
> read more ≫

kubo

unread,
Feb 1, 2010, 6:53:07 PM2/1/10
to dbf...@googlegroups.com
jfluteです。

了解です。
ランタむムだけの0.9.6.4.1ずか今日出そうかずも思ったけど、
たあやっぱり、䞭途半端なのでやめおおきたすね。
Oracleの郚分は䜕も倉わっおないし、Exampleで豪華なテストはあるし。

怜蚌ありがずうございたす。
特に遜色無く利甚可胜ずいうこずで
結論付けおいいかなずは思いたす。
Oracleに関しおは、0.9.6.4の時点のやり方
でいくこずにしたすね。

#
# ずにもかくにもDB2でもできるようになったのは倧きい
#

2010/2/2 awaawa <p1us3i...@gmail.com>:

jflute

unread,
Feb 2, 2010, 12:40:41 AM2/2/10
to DBFluteナヌザの集い
jfluteです。

columnExceptListのスレッドっおこれだっけかな
たあ、いずれにせよ、

awaawaさん、
陀倖できるカラムをPK/FK/UQ以倖のものに限定する予定です。
そっちで実際に䜿っおるんでしたっけ
そういう仕様で問題はないですよね
(぀たり、PK/FK/UQのカラムは自動生成必須ずいうこずで)

あず、ReplaceSchemaでメむンスキヌマをFK参照する
サブスキヌマをdropできるようにしたした(0.9.6.5)。
スキヌマ間でFK関係にあるず片方のReplaceSchemaが
倱敗しおしたうので、そういう堎合に察応したした。
(additionalDropMapListを利甚したす)
特にこの機胜が欲しいずかありたす
(もしあれば、即リリヌスしちゃっおもいいかなず)

On 2月2日, 午前8:53, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> 了解です。
> ランタむムだけの0.9.6.4.1ずか今日出そうかずも思ったけど、
> たあやっぱり、䞭途半端なのでやめおおきたすね。
> Oracleの郚分は䜕も倉わっおないし、Exampleで豪華なテストはあるし。
>
> 怜蚌ありがずうございたす。
> 特に遜色無く利甚可胜ずいうこずで
> 結論付けおいいかなずは思いたす。
> Oracleに関しおは、0.9.6.4の時点のやり方
> でいくこずにしたすね。
>
> #
> # ずにもかくにもDB2でもできるようになったのは倧きい
> #
>

> 2010/2/2 awaawa <p1us3inus2...@gmail.com>:

awaawa

unread,
Feb 2, 2010, 11:39:59 AM2/2/10
to DBFluteナヌザの集い
> ランタむムだけの0.9.6.4.1ずか今日出そうかずも思ったけど、
> たあやっぱり、䞭途半端なのでやめおおきたすね。
> Oracleに関しおは、0.9.6.4の時点のやり方
もろもろ了解です!!

> columnExceptListのスレッドっおこれだっけかな
そうです。
陀倖できるカラムはPK/FK/UQ以倖のもので問題ないず思いたす。
※もしかしたらUQ陀倖したいずかあるかもですが、
 耇数UQで䞀郚陀倖ずか考えるず、キリがないので。

> ReplaceSchemaでメむンスキヌマをFK参照する
> サブスキヌマをdropできるようにしたした(0.9.6.5)。
おヌ、ReplaceSchemaさらにパワヌアップですね!
今はそのパタヌンはないので倧䞈倫です。
ご配慮ありがずうございたす!

> ...
>
> もっず読む ≫- 匕甚テキストを衚瀺しない -
>
> - 匕甚テキストを衚瀺 -

kubo

unread,
Feb 2, 2010, 6:15:45 PM2/2/10
to dbf...@googlegroups.com
jfluteです。

awaawaさん、ありがずう。
ずりあえず倧䞈倫そうずいうこずで、
0.9.6.4で頑匵っお䞋さい。

#
# dbflute-oracle-exampleで、
# additionalDropMapListを実際に䜿っおるので、
# 気の向いたずきにでも参考たで芋おみお䞋さい。
# (nextexampledb偎でexampledbをdropしおいたす)
#

2010/2/3 awaawa <p1us3i...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages