[Seasar-user:14384] Re: [DBFlute]外だしSQLのページング検索機能について質問

kubo [E-MAIL ADDRESS DELETED]
2008年 5月 22日 (木) 15:28:36 JST


久保です。

なるほど、PJのSQL関数利用制限があるのですね。。。
count(distinct ...)は普通のDistinctとは用途の違う使い方なので、
その場合だけ許されて欲しい気もしますよね。
すると、今完全に回避策が無い状況でしょうか?
(ちょっとどんなSQLか把握できないので...)


ちなみに
ResultSet.last()を使ったgetRow()技を幾つかのDBで
試してみました。

Oracle -- OK
MySQL -- OK
PostgreSQL -- OK
H2 -- OK
DB2 -- できるかもしれないけど、
   ScrollableカーソルにするとBLOBやCLOBが取得できない

また、ResultSet last()で検索してみると
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/rs/CountResult.html
で、結果が大きい場合にパフォーマンス悪いかもよ
っていう警告が記載されていました。

AutoPaging()でResultSetで総件数が取得できれば、
とても魅力的ではありますが、もう少し時間かけて
検証する必要があるようです。


2008/5/22 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>  久保さん
>
> 森脇です、早速の回答ありがとうございます。
>
> 質問の件、了解しました。
> たしかにJDBCの実装に依存してしまうのはまずいかもしれませんね。
>
>
> 以下余談ですが…
> 今回なぜこのような質問をしたかというと、リスト取得のSQLにGROUP BY が混ざっており、
> 件数を取得するときに
>  COUNT(DISTINCT(a.hoge_id))
> みたいにしないと件数がとれず、それならいっそSQLは一回だけ発行で件数は
> last()を使用して取れないか?と思ったからです。
> # 発行してよいSQLの関数がPJで制限されており、DISTINCTが使えないのです…
>
>
> 2008/05/22 14:34 kubo <[E-MAIL ADDRESS DELETED]>:
>> 久保です。
>>
>> 森脇さん、こんにちは
>>
>> http://dbflute.sandbox.seasar.org/contents/outside-sql/paging.html
>>
>> memberBhv.outsideSql().autoPaging().selectPage(...);
>>
>> の話ですね。
>>
>>> 確認なのですが、自動ページングでResultSetのすっ飛ばしを利用するのは
>>> ページング絞りの条件設定のみで、総件数取得は必ずcountを取得するSQLを
>>> 記述する必要があるということでしょうか?
>>
>> この認識であっています。
>>
>> ResultSetの「カーソルによるすっ飛ばし(absolute())」なので、
>> 厳密にカウントが取得できません。
>>
>> 確かにnext()を繰り返すやり方なら簡単に取得できますが、
>> その場合、結局パフォーマンスを犠牲にする可能性があります。
>> (最後の行までぐるぐる回すことになってしまう)
>>
>> last()してgetRow()でパフォーマンス劣化せずに取得
>> できるかもしれませんが、カーソルをサポートしてるしてないの
>> DB依存な部分に左右されてしまうのと、
>> JDBCの実装がそこまで信用できるのか!?っていうのもあり、
>> カウントはもう一発SQLで取得することにしております。
>> (last()で最後の行に移動するという行為がJDBCドライバ的に
>>  パフォーマンスの良いことなのかどうかが確認できてないのです。
>>  そこの部分に確証が取れれば検討の余地ありです)
>>
>>
>> なのでお手数ですが、
>>
>> /*IF pmb.isPaging()*/
>> select member.MEMBER_ID
>>     , member.MEMBER_NAME
>>     , ...
>> -- ELSE select count(*)
>> /*END*/
>>  where ...
>>  /*IF pmb.isPaging()*/
>>  order by UNPAID_PRICE_SUMMARY desc, member.MEMBER_ID asc
>>  /*END*/
>>
>> というように、
>> A. 「Select句は、ELSEにselect count(*)」
>> B. 「OrderBy句は、ページング実データ取得時のみ」
>> と分岐させて下さい。
>>
>> 2008/5/22 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>> 森脇と申します。
>>>
>>> 外だしSQLのページング検索機能について質問です。
>>>
>>> 自動ページングの場合「ResultSetのすっ飛ばしを利用するページング」とあったので、
>>> てっきり総件数の取得も同様の方法で取得するのかと思っていましたが、
>>> 以降の説明ではcountを取得するSQLを記述すように書かれていました。
>>>
>>> 確認なのですが、自動ページングでResultSetのすっ飛ばしを利用するのは
>>> ページング絞りの条件設定のみで、総件数取得は必ずcountを取得するSQLを
>>> 記述する必要があるということでしょうか?
>>> _______________________________________________
>>> Seasar-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


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