プロが教える店舗&オフィスのセキュリティ対策術

オラクルのあるテーブルに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件程度とか少ない場合、速度差が逆転しないでしょぅか。

A 回答 (2件)

1回でできることを複数回でやるメリットは


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

色々な条件が絡みますが、次のようにすると
速度が改善されることがあります。
SELECT * FROM (SELECT * FROM Z WHWRE 条件1) WHERE 条件2
    • good
    • 0
この回答へのお礼

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


SQLも上記で速度が違うのはしりませんでした。
ありがとうございました。

お礼日時:2010/03/04 20:12

 毎回ディスクアクセスが発生するような検索方法を採った場合では、


SQL を実行した方が遅くなると考えられます。

 しかし、連続して処理が行われると仮定するならば、キャッシュに
残っているので、ヒット件数が3千件程度であるならば、ほとんど差が
表れないと考えて良いと思います。
    • good
    • 0
この回答へのお礼

キャッシュに残るというのは、
SELECT x FROM TBL_A WHERE ...AND...AND...AND...AND...AND VAL=15
の結果がキャッシュに残るのではなく、
SELECT x FROM TBL_A WHERE ...AND...AND...AND...AND...AND
の結果がキャッシュに残るのでしょうかね。

それだと確かに、あまりかわらないかもしれないという感じがしますが。
ありがとうございます!

お礼日時:2010/03/04 10:42

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