• ベストアンサー

データ抽出の速度について

オラクルのあるテーブルに10万件のレコードがあります。カラム数は30です。 初歩的な話になりますが、(1)と(2)はどちらが速いでしようか。 (1) SELECT x FROM TBL_A WHERE ...AND...AND...AND...AND...AND という複雑なSQLを実行するとします。 これに該当するレコード数は[3千件]です。 これで、 value =RS("x") RS.movenext を3千回実行する。(sqlを実行するのは一回のみ) (2) 同じく複雑なSQLを実行します。 SELECT x FROM TBL_A WHERE ...AND...AND...AND...AND...AND VAL=15 これに該当するレコード数は[1]件です。 value =RS("x") で取得。 また同じSQLを3千回実行する。 上記について初歩的ですが、確認したいです。 sql実行の対象レコードが、数万に上っても、SQLを何回も実行したほうがやはり遅いでしょうか。 また、上記の3千が、100件程度とか少ない場合、速度差が逆転しないでしょぅか。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

1回でできることを複数回でやるメリットは 全くありません。先ず、結果が3000件でも 1件でも抽出にかかる時間はほぼ同じです。 つまり、後者は前者に比べ、2999回分の 余計な時間がかかるということです。 キャッシュ云々は結果論であって、クリアな 状態を前提とすべきです。 むしろ、SQLの組み方一つで実行時間に差が でます(特にOracleは)ので、高速になる 技法を学ぶ方がずっと有益です。 例えば、以下のようなSQLがあるとします。 SELECT * FROM Z WHERE 条件1 AND 条件2 色々な条件が絡みますが、次のようにすると 速度が改善されることがあります。 SELECT * FROM (SELECT * FROM Z WHWRE 条件1) WHERE 条件2

ownmart
質問者

お礼

そうなんですね。抽出にかかる時間がほぼ同じなら、 SQL一回で実行し、あとはレコードを何回も取得する方法が 対象件数にも影響されず、本来理想そうです。 SQLも上記で速度が違うのはしりませんでした。 ありがとうございました。

その他の回答 (1)

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

 毎回ディスクアクセスが発生するような検索方法を採った場合では、 SQL を実行した方が遅くなると考えられます。  しかし、連続して処理が行われると仮定するならば、キャッシュに 残っているので、ヒット件数が3千件程度であるならば、ほとんど差が 表れないと考えて良いと思います。

ownmart
質問者

お礼

キャッシュに残るというのは、 SELECT x FROM TBL_A WHERE ...AND...AND...AND...AND...AND VAL=15 の結果がキャッシュに残るのではなく、 SELECT x FROM TBL_A WHERE ...AND...AND...AND...AND...AND の結果がキャッシュに残るのでしょうかね。 それだと確かに、あまりかわらないかもしれないという感じがしますが。 ありがとうございます!