- PR -

select count(*)の性能

1
投稿者投稿内容
すてぃーぶ
会議室デビュー日: 2003/05/20
投稿数: 13
投稿日時: 2006-04-03 14:25
Oracle9iで、登録済みのレコード件数を調べるSQLをプログラムに組み込もうとしたところ、同僚から「select count(*)は全行検索がかかるからやめたほうがいい」と言われました。本番稼動すると100万件くらい登録されるテーブルなのですが、本当なんでしょうか...。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-03 14:32
引用:

すてぃーぶさんの書き込み (2006-04-03 14:25) より:

同僚から「select count(*)は全行検索がかかるからやめたほうがいい」と言われました。


"検索" ですか。
「検索」がどういうレベルで「検索」と言っているのかわかりませんが、
それを抜きにしても "全" である事実は別に変わらないと思うのですが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2006-04-03 14:33
主キーの索引があればそっちを参照するでしょうが、索引のない表だったら
全件検索しないと件数は分からないですし。

_________________
もしもし@RMAN 友の会
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2006-04-03 16:06
「COUNT(*)よりもCOUNT(列名)の方が速い」という話題でしょうか?
であれば、今のOracleには当てはまりません。
http://www.jlcomp.demon.co.uk/faq/count_rows.html
オプティマイザがルールベースからコストベースに変わり、
以前は常識とされていたSQLの記述に関するTipsの多くが
今では無意味なものとなっています。

こういうパフォーマンス系のTipsというのは、
たとえ同じ製品でもバージョンがちょっと違うだけで
全く役立たずになることがよくありますね。
昔は常識だったことでも鵜呑みにせず、ちゃんと自分の手で
検証することがパフォーマンスチューニングの鉄則です。
猫山みやお
大ベテラン
会議室デビュー日: 2004/09/09
投稿数: 119
投稿日時: 2006-04-03 17:41

随分と懐かしい迷信ですね。
まいるどきゃっと
大ベテラン
会議室デビュー日: 2004/08/12
投稿数: 135
お住まい・勤務地: 群馬
投稿日時: 2006-04-03 17:54
最近のOracleでは意味のないものになってますね。

ただ、DBによっては今でも有効なので、頭の片隅に置いておいて損はないです。
ちなみに、DB2ではSELECT COUNT(*)は使用しないでほしいそうです

# 知らずにOracleの癖で500万件の表にSELECT COUNT(*)を投げてしまいました …… orz
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2006-04-04 23:57
他の方も仰られているようにDBによりますね。

Oracle では違いがありません。ルールベースであれば FULL SCAN, コストベースであれば INDEX FAST FULL SCAN になるのではないでしょうか (後者の方が読み込みブロック数が少ない分だけ高速)。
1

スキルアップ/キャリアアップ(JOB@IT)