[Seasar-user:19907] Re: [S2JDBC] h2database利用時のAutoSelect<T>.getCount()の挙動について

TAKEUCHI Hideyuki [E-MAIL ADDRESS DELETED]
2010年 6月 24日 (木) 03:52:02 JST


どうも、竹内です。

> ん??
> H2 の count(*) が最適化されるのは where 句が
> 無い場合だけということなので,条件を付加する
> 場合は AutoSelect を使ってもいいのでは?
> 
> http://www.h2database.com/html/performance.html#database_performance_tuning
> 
> COUNT(*) Optimization
> 
> If the query only counts all rows of a table,
> then the data is not accessed.
> However, this is only possible if no WHERE clause is used,
> that means it only works for queries of the form
> SELECT COUNT(*) FROM table.

そう書いてあるのは知っていておかしいなとは思っているのですが、
実際にはインデックスがついているカラムをWHERE句で
指定してもなぜか高速に動作します。

例えばインデックスがついているvalidというboolean型のカラムを持つ
テーブルに25万件強のレコードが入ってて

select count(*) from handout where valid
だと一瞬で要素数(20万件強)が帰ってきます。

select count(id) from handout where valid
だと1分ぐらい待たされます。

select count(valid) from handout where valid
だと今度は一瞬ですね。

boolean型ではなくint型とかでも同じような結果になります。

not nullの制約がついたカラムでもcount()が数え上げるときに
nullかどうかをいちいちチェックしちゃっているとかそんなんなんですかね?

--
たけうち


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