• ベストアンサー

SQL 件数取得を速くしたい

SQLでテーブルなどからSELECTされた件数を得る際に、 select count(*) from ~ 等とするかと思いますが、この結果が返ってくるのが遅くて困っています。 少しでも速く件数を得たいのですがどのような方法がありますでしょうか? 教えてください。 私が使っている環境はOracle 8iで 特に今回はgroup byを含むビューからの検索を行おうとしています。

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 Select count(*) は全件検索なので、それ程早くする事は 難しいと思います。 対策として 1) DB_FILE_MULTIBLOCK_READ_COUNT の値を増やして   1回のI/O で読み込むブロック数を多くする。 2) ファイルを複数のディスクに分散させてI/O 効率を上げる 3) HWM を下げる。 (一度Export/Import を行う)    と言った感じでしょうか? 問題の表の使い方にもよりますが、多少の誤差が許されるなら 時間のあるときに表をAnalyze しておいてUSER_TABLES.NUM_ROWS を 検索すると言う方法も。

その他の回答 (3)

  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.4

#3の方がいわれるとおり結合に時間がかかっているのかもしれませんね。ビューはI/Oに負荷がかかりますから。 あくまで実行計画を見たうえでですが、 とりあえずPL/SQLで書きなおしてみるのもいいかもしれません。 あと、手間はかかりますが、あまりに遅いのでしたらテーブルの非正規化を行ってみるのもよいかもしれません。

  • yuji
  • ベストアンサー率37% (64/169)
回答No.3

count(*)が遅いのではなくて、テーブルの結合が遅いのでは? PLAN_TABLEを使って実行計画を取得するなどして、 遅い箇所(適正にインデックスが張られていないなど)を調査した方が いいと思います。 ちなみに、ANo#1のcount(*)をやめる方法ですが、 これは逆に遅くなることもあるので、両方測定した方がいいでしょう。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

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