みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

countのスピード

DBはMySQL/PostgreSQLがメインで、はじめてOracleを触っています。

現在、70万件のデータのあるテーブルを
select count(*) from テーブル名
と SQL*Plusで実行してみたところ、結果がかえってくるまで
7秒近くかかってしまいました。
(*)が悪いのかな、と思って count(hoge) にしてみましたが、
大差がありません。。。。

テーブルは、number型の項目が10個、varchar型の項目が2個と
それほど大きくはなく、そのうち5つのnumber型の項目に
インデックスが貼られています。

count(hoge)で、hogeにインデックスの貼られている項目、貼られていない項目をそれぞれ試してみましたが、これも大差のない時間がかかっていました。このDBはもちろん、オラクルに接続しているのは私1人のみ、という状況です。

70万件というデータ数は決して多い数字ではないと思うのですけれど、オラクルだとこんなものなのでしょうか?オラクルは始めてで、びくびく触っていることもあって、何から手を付けていいのかもさっぱりです。どんな点を見直せばいいのか、教えてください(_ _)

投稿日時 - 2006-11-22 16:39:16

QNo.2555539

困ってます

質問者が選んだベストアンサー

「select count(*) from テーブル名」で実行した場合、「全表スキャン」となってしまいます。テーブルがたとえ70万件あっても、対象ブロックはHWMまでアクセスしてしまうため、テーブルによっては遅い場合があります。

こういった場合、ヒントを使って「高速全索引スキャン」でアクセスすることでパフォーマンスをあげることができます。
たとえばTABLE名(hoge)、主キー(hoge_pk)だった場合

SELECT /*+ INDEX_FFS(hoge hoge_pk) */ count(*) from hoge;
という感じで書きます。/*+ */で囲んでいる箇所がヒントになります。
#コメントと紛らわしいですが。

INDEX_FFSは初期化パラメータのDB_FILE_MULTIBLOCK_READ_COUNT
に影響を受けるのでALTER SESSIONなどでDB_FILE_MULTIBLOCK_READ_COUNTを変更すると結果に差がでると思います。

投稿日時 - 2006-11-23 10:02:49

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問