COUNT(*)について
COUNT(*)は遅いので件数取得はCOUNT(KEY)にすべきと言われたが、
前にコスト測ったら大して変わらなかった気がしたので、真面目に調べてみた。
先に結論を書くと、DB2や最近のOracleの場合、問題ない。
1.そもそもこの発言のネタ元は・・・
ネタ元はおそらく下記のサイト
http://www.geocities.jp/mickindex/database/db_optimize.html
『作成日:2002/10/25』とあるから時代錯誤な知識の可能性が高い。
2.実際はどうなのか?また、現状はどうなのか?
次にOracleのフォーラムを見ると昔はたしかにそうだったとのこと。
現在の主流のオプティマイザの種類と昔のオプティマイザの種類は異なっており、
昔は、RBO(ルールベース・オプティマイザ)を使っており、
現在は、CBO(コストベース・オプティマイザ)を基本使っている。
CBOの場合、COUNT(*)としてもコスト計算した上でよりコストの低い実行計画をDBで建ててくれるので問題ない。
ちなみに、RBOとCBOは下記のサイトの解説が詳しい。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060111/227100/
3.DB2ではどうなのか?
DB2の場合は、CBOを採用しているので、基本的にCOUNT(*)問題ない。
ただし、ALTER TABLE テーブル名 VOLATILE文とか実行されていると統計情報が無視されるので、
RBO的な動きになるので、COUNT(KEY)の方が早いかも。
VOLATILE文利用時は未検証。
ちなみに、他のTIPSも時代錯誤な知識に結構なってるらしい。
とりあえず、今回はCOUNT(*)についてのみ調べてみた次第です。