- - PR -
select count(*)の性能
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-04-03 14:25
Oracle9iで、登録済みのレコード件数を調べるSQLをプログラムに組み込もうとしたところ、同僚から「select count(*)は全行検索がかかるからやめたほうがいい」と言われました。本番稼動すると100万件くらい登録されるテーブルなのですが、本当なんでしょうか...。
| ||||
|
投稿日時: 2006-04-03 14:32
全行 "検索" ですか。 「検索」がどういうレベルで「検索」と言っているのかわかりませんが、 それを抜きにしても "全行" である事実は別に変わらないと思うのですが... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-04-03 14:33
主キーの索引があればそっちを参照するでしょうが、索引のない表だったら
全件検索しないと件数は分からないですし。 _________________ もしもし@RMAN 友の会 | ||||
|
投稿日時: 2006-04-03 16:06
「COUNT(*)よりもCOUNT(列名)の方が速い」という話題でしょうか?
であれば、今のOracleには当てはまりません。 http://www.jlcomp.demon.co.uk/faq/count_rows.html オプティマイザがルールベースからコストベースに変わり、 以前は常識とされていたSQLの記述に関するTipsの多くが 今では無意味なものとなっています。 こういうパフォーマンス系のTipsというのは、 たとえ同じ製品でもバージョンがちょっと違うだけで 全く役立たずになることがよくありますね。 昔は常識だったことでも鵜呑みにせず、ちゃんと自分の手で 検証することがパフォーマンスチューニングの鉄則です。 | ||||
|
投稿日時: 2006-04-03 17:41
随分と懐かしい迷信ですね。 | ||||
|
投稿日時: 2006-04-03 17:54
最近のOracleでは意味のないものになってますね。
ただ、DBによっては今でも有効なので、頭の片隅に置いておいて損はないです。 ちなみに、DB2ではSELECT COUNT(*)は使用しないでほしいそうです。 # 知らずにOracleの癖で500万件の表にSELECT COUNT(*)を投げてしまいました …… orz | ||||
|
投稿日時: 2006-04-04 23:57
他の方も仰られているようにDBによりますね。
Oracle では違いがありません。ルールベースであれば FULL SCAN, コストベースであれば INDEX FAST FULL SCAN になるのではないでしょうか (後者の方が読み込みブロック数が少ない分だけ高速)。 |
1