dポイントプレゼントキャンペーン実施中!

SQLでテーブルなどからSELECTされた件数を得る際に、
select count(*) from ~ 等とするかと思いますが、この結果が返ってくるのが遅くて困っています。

少しでも速く件数を得たいのですがどのような方法がありますでしょうか?
教えてください。

私が使っている環境はOracle 8iで
特に今回はgroup byを含むビューからの検索を行おうとしています。

A 回答 (4件)

こんにちわ。



Select count(*) は全件検索なので、それ程早くする事は
難しいと思います。
対策として
1) DB_FILE_MULTIBLOCK_READ_COUNT の値を増やして
  1回のI/O で読み込むブロック数を多くする。
2) ファイルを複数のディスクに分散させてI/O 効率を上げる
3) HWM を下げる。 (一度Export/Import を行う)
  
と言った感じでしょうか?

問題の表の使い方にもよりますが、多少の誤差が許されるなら
時間のあるときに表をAnalyze しておいてUSER_TABLES.NUM_ROWS を
検索すると言う方法も。
    • good
    • 0

#3の方がいわれるとおり結合に時間がかかっているのかもしれませんね。

ビューはI/Oに負荷がかかりますから。

あくまで実行計画を見たうえでですが、
とりあえずPL/SQLで書きなおしてみるのもいいかもしれません。
あと、手間はかかりますが、あまりに遅いのでしたらテーブルの非正規化を行ってみるのもよいかもしれません。
    • good
    • 0

count(*)が遅いのではなくて、テーブルの結合が遅いのでは?



PLAN_TABLEを使って実行計画を取得するなどして、
遅い箇所(適正にインデックスが張られていないなど)を調査した方が
いいと思います。


ちなみに、ANo#1のcount(*)をやめる方法ですが、
これは逆に遅くなることもあるので、両方測定した方がいいでしょう。
    • good
    • 0

ダメかもしれませんが


count(*)
の * の代わりに インデックスが はってある項目を入れるとかしたら
どうでしょうか?
そんなに効果は、ないと思いますが・・・。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!